bashスクリプトを実行する前にすべてのコマンドを出力する方法は?


88

たとえば、単純なbashファイルがあります

#!/bin/bash
cd ~/hello
ls

実行する前にすべてのコマンドを表示するにはどうすればよいですか?Windowsバッチスクリプトでの "@echo off"の逆効果。


1
setオプションが何であるかを探している人のために、あなたはこのマニュアルページでそれら見つけることができます
mkobit

あなたは、単にこのようシェバングを拡張することができます#!/bin/bash -x
sobi3ch

回答:


110
bash -x script

または

set -x

スクリプトで。

でオプションを再度設定解除できますset +x。いくつかのコマンドでそれをしたいだけなら、サブシェルを使用できます: `(set -x; command1; command; ...;)


私はこれを常に効果的に使用してきました。出力は、最初に予想するよりも少し汚れています。
スコットパック

2
設定PS4することにより、のプロンプトを微調整できます-x。例えば:PS4='Line $LINENO @ $(date +%s.%N): ' bash -x scriptdateただし、それが遅くなります)
ウォルターTross

23

これらも機能します:

set -v

または

#!/bin/bash -v

ただし、-vは各スクリプト行の前にPS4文字列を出力せず、「for」ステートメントのステップを個別にトレースしません。コメントをエコーし​​ますが、-xはエコーしません。

次に、-vを使用した出力の例を示します。

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

-xを使用した同じスクリプトの結果を次に示します。

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

-vと-xの違いを強調するために「echo -n」を含めたことに注意してください。また、-vは "-o verbose"と同じですが、後者はシバンの一部として機能しないようです。


素晴らしい説明!調査を行わずに、VerboseとeXplicitがこれらの2つの文字を表しているように思えます。
猿の家

-xはeXecuteに近いと思います。
スティーブンパークス


6

これは動作するはずです:

set -o verbose #echo on
...
set +o verbose #echo off

4

set -o xtraceそしてset +o xtrace、あなたの友達です(それは、よりも冗長で-o verbose、出力はSTDERRに送られますが、冗長ではなく、STDOUTに記録されるようです)。

その他のヒントはこちらをご覧ください


3

いくつかの方法があります。

#!/usr/bin/env bash -x

シバンラインとして。

set -xスクリプト自体に含めると、機能が有効になり、set +x無効になります。これらの方法はどちらも、より移植性の高いshシェルでも機能します。

正しく覚えていれば、perlにも-xオプションがあります。


1

のように行く

language -x script

言語= python、perl、bash -x =演算子スクリプト=ファイル名

それが役に立てば幸い。


3
-xPythonでエコーを持つには何も持っていない
ユージンPankov

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