bashスクリプトでの予行演習の実装


15

bashスクリプトで予行演習オプションをどのように実装しますか?

スクリプトがドライランで実行されている場合、すべてのコマンドを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`

これは単に間違っているのですか、それを行うためのはるかに良い方法がありますか?


そのため、実際にコマンドを実行せずに、コマンドが実行する内容($ VARIABLESの値を含む)を出力する必要があります。私はあなたの_run()関数のようなものを使用しますが、「set -xv」を使用することもありますが、より良い方法が必要です。
ステファンLasiewski

ええ、まさにそれ。内部変数は、コマンドが実際に実行されませんので、あなたの代わりに機能を介してそれらを渡すのは、bashに設定することができますがない場合、私は思ったんだけど
アンドレイSerdeliuc

2
この質問にコミュニティwikiのマークを付けるべきだった理由はありません。
追って通知があるまで一時停止します。

Bashはシェルです。ドライランを行う理由はありません。私はあなたがすでにやったよりもそれを行うより良い方法があるとは思わない。
d -_- b

回答:


2

参照BashFAQ / 050:私は変数にコマンドを入れしようとしているが、複雑なケースは常に失敗!この主題の議論のため。

現在は削除されていますが、「テスト機能をプログラムに追加する方法」のセクションは依然として有用です。


代替手段ではありませんが、長いbashプログラムをテストして作業するための優れたリソースのようです。
アンドレイセルデリウ

前述のとおり、答えのポイントは特定のハウツー部分を指すのではなく、ディスカッション全体を読むことなので、リンクされたページの特定の部分にアンカーを追加した編集をロールバックしました。リンクされたページのポイントは、多くの落とし穴があるため、実行するコマンドを変数に入れないようにすることです。
追って通知があるまで一時停止します。

この回答がこの記事の重要なポイントを要約していると、はるかに便利です。1行の回答は依然として貧弱な回答です。
マークブース

4

@Dennis Williamson'sからの回答で遊んでみたかった。ここに私が得たものがあります:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.