%20%EC%8B%A4%ED%96%89.png)
다음과 같은 자동 추출 bash 스크립트(끝 부분에 바이너리 데이터가 추가됨)가 있습니다.
#!/bin/bash
export TMPDIR=$(mktemp -d)
ARCHIVE_START_LINE=$(...) # <omitted>
# extracting data archive into a temporary directory
tail -n+$ARCHIVE_START_LINE $0 | tar xzv -C $TMPDIR
# <ACCESSING_ARCHIVED_RESOURCES>
exit 0
# <BINARY_DATA_ARCHIVE>
스크립트는 원격으로 호스팅됩니다.https://<omitted>/script.sh
스크립트를 가져와 로컬에서 실행하고 싶습니다.
tail
현재 파일 이름을 인수로 전달하는 스크립트 내에서 사용하고 있으므로 다음을 수행할 수 없습니다.
/bin/bash -c "$(curl -fsSL https://<omitted>/script.sh)"
물론 먼저 임시 파일에 저장할 수 있습니다. 예:
TMP=$(mktemp); curl -fsSL https://<omitted>/script.sh > $TMP; sh $TMP; rm $TMP
하지만... 더 깔끔한 방법은 없을까요?
답변1
. tail
대신 데이터를 변수로 저장하십시오.
#!/bin/bash
## begin data dump
read -r -d '' archive_data <<'EoF'
<BINARY_DATA_ARCHIVE>
EoF
## end data dump
export tmpdir=$(mktemp -d)
# extracting data archive into a temporary directory
printf '%s' "$archive_data" | tar xzv -C "$tmpdir"
exit 0
코멘트:
\0
데이터 아카이브에 NUL( ) 이 포함될 수 있는 경우에는 작동하지 않습니다..주위의 작은따옴표에 유의하세요
'EoF'
. 이는$
잘못된 변수 이름으로 확장되지 않도록 보장합니다.또한 관례에 따라 전역 환경 변수는 대문자로 표시되어 이름 충돌 및 예상치 못한 버그가 발생할 수 있으므로 쉘 변수에 대문자를 사용하는 것은 나쁜 습관이므로 변수를 소문자로 변경했습니다. 변수에 소문자를 사용하고 가능하면 전역 환경만 대문자로 사용하세요.
디렉토리를 생성하려는 것 같고 명령 없이 파일을 만드는 것 같아서
mktemp
으로 변경했습니다 .mktemp -d
-d
mktemp
이제 다음과 같은 작업을 수행할 수 있습니다.
curl -fsSL https://<omitted>/script.sh | bash