
我需要壓縮一些文件,其中一個是點文件。
FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml
FILES="${FILE1#/} ${FILE2#/}"
tar -C / -cf /tmp/foo/files.tar "$FILES"
變數替換避免了tar: Removing leading '/' from member names
警告,並簡化了解壓過程。
但我收到這個錯誤:
tar:tmp/foo/.env tmp/foo/docker-compose.yml:無法統計:沒有這樣的檔案或目錄
硬編碼路徑有效:tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
.
所以我認為問題在於處理該點文件,或與轉義有關?
答案1
當外殼膨脹時"$FILES"
,空間就失去了其語法價值。因此該命令作為單一路徑tar
接收。tmp/foo/.env tmp/foo/docker-compose.yml
就像
file='a b'
touch "$file"
將創建文件a b
,而不是兩個文件a
和b
。
因此,正如評論中所建議的,您應該對不同的文件使用不同的變數:tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}"
.
直接運行有效的事實tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
是因為空格在那裡具有語法價值,將一個參數與另一個參數分開。對於「人眼」來說, "$FILES"
to擴展後會產生相同的空間tmp/foo/.env tmp/foo/docker-compose.yml
,但在這種情況下,由於引用,空間沒有特殊意義,因此整個值將被視為單一路徑。