
我有一個自解壓縮的 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'
,這些可確保任何$
不會擴展為錯誤的變數名稱。我還將您的變數更改為小寫,因為對 shell 變數使用大寫是不好的做法,因為按照慣例,全域環境變數是大寫的,這可能會導致命名衝突和意外錯誤。變數使用小寫字母,並且僅在可能的情況下將全域環境變數大寫。
我更改
mktemp
為,mktemp -d
因為您似乎正在嘗試建立目錄,並且沒有-d
該命令mktemp
會建立一個檔案。
你現在應該能夠做類似的事情
curl -fsSL https://<omitted>/script.sh | bash