bash スクリプトで dry-run オプションを実装するにはどうすればよいでしょうか?
スクリプトが dry-run で実行されている場合、コマンドを実行する代わりに、すべてのコマンドを if でラップしてコマンドをエコー出力することが考えられます。
別の方法としては、関数を定義し、各コマンド呼び出しをその関数に渡すことです。
何かのようなもの:
function _run () {
if [[ "$DRY_RUN" ]]; then
echo $@
else
$@
fi
}
`_run mv /tmp/file /tmp/file2`
`DRY_RUN=true _run mv /tmp/file /tmp/file2`
これは単に間違っているのでしょうか、もっと良い方法があるのでしょうか?
答え1
見るBashFAQ/050: 変数にコマンドを入れようとしていますが、複雑なケースでは常に失敗します。この主題についての議論のため。
現在は削除されているが、プログラムにテスト機能を追加する方法まだ役に立つかもしれません。
答え2
@Dennis Williamson さんの回答を試してみたかったのです。以下が私の回答です:
Run () {
if [ "$TEST" ]; then
echo "$*"
return 0
fi
eval "$@"
}
ここではがeval "$@"
重要であり、単に を実行するよりも優れています$*
。$@
はすべてのパラメータを返し、$*
空白/引用符なしですべてのパラメータを返します。
$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r-- 1 stefanl stefanl 0 Jun 2 21:06 dir/file1
-rw-r--r-- 1 stefanl stefanl 0 Jun 2 21:06 dir/file2