回答:
set -x
または set -o xtrace
変数を展開し、行の前に小さな+記号を出力します。
set -v
またはset -o verbose
、印刷前に変数を展開しません。
set +x
およびset +v
を使用して、上記の設定をオフにします。
スクリプトの最初の行に、#!/bin/sh -x
(または-v
)を入れて、後のスクリプトset -x
(または-v
)と同じ効果を得ることができます。
上記はでも動作し/bin/sh
ます。
set
属性とデバッグについては、bash-hackersのwikiを参照してください。
$ cat shl
#!/bin/bash
DIR=/tmp/so
ls $DIR
$ bash -x shl
+ DIR=/tmp/so
+ ls /tmp/so
$
set -x
あなたが望むものをあなたに与えるでしょう。
デモ用のシェルスクリプトの例を次に示します。
#!/bin/bash
set -x #echo on
ls $PWD
これにより、すべての変数が展開され、コマンドの出力前に完全なコマンドが出力されます。
出力:
+ ls /home/user/
file1.txt file2.txt
set -o verbose
かset -v
(唯一の「冗長」)またはset -o xtrace
またはset -x
(のみ「XTRACE」)またはset -xv
(両方)またはset -o xtrace -o verbose
(両方)。
関数を使用してコマンドをエコーし、実行します。
#!/bin/bash
# Function to display commands
exe() { echo "\$ $@" ; "$@" ; }
exe echo hello world
どの出力
$ echo hello world
hello world
より複雑なコマンドパイプなどの場合は、evalを使用できます。
#!/bin/bash
# Function to display commands
exe() { echo "\$ ${@/eval/}" ; "$@" ; }
exe eval "echo 'Hello, World!' | cut -d ' ' -f1"
どの出力
$ echo 'Hello, World!' | cut -d ' ' -f1
Hello
++ set +x
オフにすると出力が回避され、見た目もきれいになります。ただし、1つまたは2つのステートメントでは、サブシェルを使用したbhasselの答えが最も便利です。
set +x
、すべてのコマンドに影響します。
cp "foo bar" baz
し、cp foo "bar baz"
例えば、。したがって、進行状況の情報をユーザーに表示するのに適しています。出力のデバッグや再現可能なコマンドの記録にはそれほど役立ちません。さまざまなユースケース。ではzsh
、あなたが引用し保存することができ:q
修飾子:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
、コマンドから単語の他のインスタンスを削除します。だから、それが正しく動作することを期待しないでexe eval "echo 'eval world'"
ください!
選択行をエコーするためのshuckcの回答にはいくつかの欠点があります。次のset +x
コマンドもエコーされることになり、終了コード$?
がによって上書きされるため、終了コードをテストできなくなりますset +x
。
別のオプションは、サブシェルでコマンドを実行することです:
echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )
if [ $? -eq 0 ] ; then
echo "curl failed"
exit 1
fi
次のような出力が得られます:
getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed
ただし、これにより、コマンドの新しいサブシェルを作成するオーバーヘッドが発生します。
++ set +x
出力を回避するための素晴らしい方法。
if [ $? -eq 0 ]
とif (set -x; COMMAND)
。
別のオプションは、コマンドラインではなく、スクリプトの先頭に「-x」を置くことです。
$ cat ./server
#!/bin/bash -x
ssh user@server
$ ./server
+ ssh user@server
user@server's password: ^C
$
./myScript
してbash myScript
。まだ指摘しておくべき良いこと、ありがとう。
TLDPの初心者向けBashガイドによると:第2章スクリプトの作成とデバッグ:
2.3.1。スクリプト全体のデバッグ
$ bash -x script1.sh
...
SourceForgeで利用可能なBash用の本格的なデバッガーが利用可能になりました。これらのデバッグ機能は、3.x以降のほとんどの最新バージョンのBashで使用できます。
2.3.2。スクリプトの一部のデバッグ
set -x # Activate debugging from here w set +x # Stop debugging from here
...
表2-1。設定されたデバッグオプションの概要
Short | Long notation | Result
-------+---------------+--------------------------------------------------------------
set -f | set -o noglob | Disable file name generation using metacharacters (globbing).
set -v | set -o verbose| Prints shell input lines as they are read.
set -x | set -o xtrace | Print command traces before executing command.
...
または、最初の行のシェル宣言に必要なオプションを追加することにより、スクリプト自体でこれらのモードを指定できます。UNIXコマンドの場合は通常そうであるように、オプションを組み合わせることができます。
#!/bin/bash -xv
オプションを使用して、デバッグモードでBashスクリプトを実行でき-x
ます。
これにより、すべてのコマンドがエコーされます。
bash -x example_script.sh
# Console output
+ cd /home/user
+ mv text.txt mytext.txt
スクリプトに-xオプションを保存することもできます。-x
シバンでオプションを指定するだけです。
######## example_script.sh ###################
#!/bin/bash -x
cd /home/user
mv text.txt mytext.txt
##############################################
./example_script.sh
# Console output
+ cd /home/user
+ mv text.txt mytext.txt
bash -vx
、同じことを行いますが、変数補間は行いません
以下のためにcsh
とtcsh
、することができますset verbose
かset echo
(あるいはあなたも、両方を設定することができますが、それはほとんどの時間のいくつかの重複が生じる場合があります)。
の verbose
オプションは、入力したシェル式をほぼ正確に出力します。
このecho
オプションは、スポーンによって実行される内容をより詳しく示しています。
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose
If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo
If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
複合コマンドをエコーできるようにするには、eval
plus Sothのexe
機能を使用してコマンドをエコーし、実行します。これは、パイプされたコマンドの何も表示しないか、パイプされたコマンドの最初の部分のみを表示するパイプコマンドに役立ちます。
評価なし:
exe() { echo "\$ $@" ; "$@" ; }
exe ls -F | grep *.txt
出力:
$
file.txt
評価あり:
exe() { echo "\$ $@" ; "$@" ; }
exe eval 'ls -F | grep *.txt'
どの出力
$ exe eval 'ls -F | grep *.txt'
file.txt