23

シェル スクリプトでは、ステータスとデバッグの理由から、いくつかの主要な (長時間実行される) コマンドをエコーし​​たいと考えています。set -xまたはを使用して、すべてのコマンドのエコーを有効にできることを知っていますset -v。しかし、すべてのコマンドを表示したくはありません (特に、echo コマンドは表示されません)。1 つのコマンドだけでエコーをオンにする方法はありますか?

私はこのようにすることができますが、それは醜く、次の行set +xもエコーします。

#!/bin/sh

dir=/tmp
echo List $dir

set -x
ls $dir
set +x

echo Done!

これを行うより良い方法はありますか?

4

4 に答える 4

30

機会ごとのプロセスのコストで、次を使用できます。

(set -x; ls $dir)

これにより、サブシェルでコマンドが実行されるためset -x、括弧内の内容のみが影響を受けます。をコーディングしたり、表示したりする必要はありませんset +x。選択的なトレースを行う必要があるときにこれを使用します。

于 2012-10-04T00:47:02.513 に答える
4

この機能を使ってみませんか?

runtraced() {
    echo "$@"
    "$@"
}

dosomething
runtraced dosomethingelse
于 2012-10-05T01:53:07.110 に答える
2

Jonathan Leffler の回答に基づいて、これは同じように機能しますが、コマンドの後に注意が必要なため、もう少し明確になります。ただし、使用するシェルを指定する必要があります。これは sh の例です。

sh -xc ls $dir
于 2012-10-05T01:47:50.860 に答える
2

これを行う簡単な方法は、heredocと 未解釈の文字列を使用することです。これは POSIX 移植可能で高速です。

...
% cmd='ls ${dir}'
% sh -x <<_EOF_
> ${cmd}
> _EOF_
...

この方法でスクリプト全体を構築し、必要に応じてプログラムで解析および/または変更し、シェル変数に保存してシェル変数から呼び出し、別のスクリプトまたはシェル関数内からすべてを実行できます。

...
% script="$(cat </some/entire/script.sh)"
% script="$(pipeline | processing | on | ${script})"    
% sh -x <<_EOF_ 2>&1 | grep ${specific_cmds_Im_looking_for}
> ${script}
> _EOF_
<desired output>

関数がshスクリプトで定義されているかどうかを確認するPOSIX準拠の方法に対する私の回答では、これの方法と理由をより詳細に説明しています。また、Stack Exchangeでは、関数またはスクリプトで実際の(解釈されていない) シェル引数を取得する方法はありheredocますか? .

-マイク

于 2013-11-23T12:21:10.160 に答える