Bourneシェルスクリプト(読み取り:Bash拡張機能は利用できません)で実行しようとしていますが、rsync
多くの検索、一重引用符/二重引用符の組み合わせ、エスケープなどを実行した後に引数を正しく渡すことはできません--out-format='%n'
。
たとえば、次のスクリプトは次のようになります。
#!/bin/sh
(set -x ; $(rsync -auh --delete --out-format='%n' "$1" "$2")) || exit 1
MacOS 10.12.6 で呼び出すと、./myscript.sh dir1/ dir2/
次の出力が返されます。
++ 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'
同じ行にあるすべてのファイルではなく、1行に1つのファイルを出力するからです。さらに、その疑問の始まりが./
エラーの原因(または結果)であるようです。
--out-format='%n'
これをスクリプトから削除すると、エラーなしでうまく動作します。
--out-format='%n'
端末でコマンドを実行すると、引数に一重引用符(および)が含まれているかどうかにかかわらず正常に--out-format=%n
実行されます。スクリプトでは、どちらの場合も失敗します。
このエラーの原因は何ですか?
答え1
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
失敗しても。