Osx
從 Bourne shell 腳本將 –out-format=FMT 參數傳遞給 rsync
我正在嘗試
rsync
從 Bourne shell 腳本執行(閱讀:Bash 擴展不可用),經過大量搜尋、單/雙引號組合、轉義等,我無法正確傳遞--out-format='%n'
參數。例如,這個腳本:
#!/bin/sh (set -x ; $(rsync -auh --delete --out-format='%n' "$1" "$2")) || exit 1
./myscript.sh dir1/ dir2/
在 MacOS 10.12.6 上呼叫 like 時會返回此輸出:++ rsync -auh --delete --out-format=%n dir1/ dir2/ + ./ file1.c file1.h file2.c file2.h myscript.sh: line 3: ./: is a directory
file1.c
file1.h
file2.c
的file2.h
內容在哪裡dir1/
首先,我不知道為什麼要
+ ./ file1.c file1.h file2.c file2.h
輸出該行,因為--out-format='%n'
每行輸出一個文件,而不是同一行上的所有文件。此外,神秘的開始./
似乎是錯誤的原因(或後果)。如果我
--out-format='%n'
從腳本中刪除,那麼它執行良好,沒有錯誤。如果我從終端執行命令,它在參數中使用單引號和沒有它們(
--out-format='%n'
和--out-format=%n
)都可以正常執行。在腳本上時,在兩種情況下都失敗了。什麼可能導致此錯誤?
您正在
rsync
命令替換中執行該命令。命令替換將被其中的命令輸出替換,並且根據腳本的編寫方式,此輸出將作為命令執行,這就是您收到錯誤消息和看似奇怪的跟踪輸出的原因。反而:
#!/bin/sh -x rsync -auh --delete --out-format='%n' "$1" "$2" || exit 1
如果您仍然希望
set -x
在腳本中的子外殼中使用:#!/bin/sh ( set -x; rsync -auh --delete --out-format='%n' "$1" "$2" ) || exit 1
如果 是腳本中的最後一個命令,
exit 1
則 可能會被刪除rsync
,因為腳本的退出狀態將是執行的最後一個命令的退出狀態,除非無論多麼失敗都想強制它為 1。rsync