Osx

從 Bourne shell 腳本將 –out-format=FMT 參數傳遞給 rsync

  • July 25, 2019

我正在嘗試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.cfile2.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

引用自:https://unix.stackexchange.com/questions/532191