web-dev-qa-db-ja.com

bashスクリプトが実行前にすべてのコマンドを出力するようにするにはどうすればよいですか?

たとえば、私は単純なbashファイルを持っています

#!/bin/bash
cd ~/hello
ls

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

90
Epeius
bash -x script

または

set -x

スクリプトで。

set +xを使用して、オプションを再度設定解除できます。いくつかのコマンドで実行したい場合は、サブシェルを使用できます: `(set -x; command1; command; ...;)

114
Steven Parkes

これらも機能します:

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

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

これも機能するはずです:

#!/bin/bash -x
cd ~/hello
ls
10
tomoe

これはうまくいくはずです:

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

set -o xtraceset +o xtraceは友達です(-o verboseよりも詳細であり、出力はSTDOUTに記録されるように見える冗長ではなく、STDERRに送られます)。

その他のヒントを見る こちら

4
pihentagy

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

#!/usr/bin/env bash -x

シバン線として。

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

私が正しく覚えている場合、Perlには-xオプションもあります。

3
user6784

のようになります

language -x script

言語= python、Perl、bash -x =オペレータースクリプト=ファイル名

それが役に立てば幸い。

1
debuggerpk

#! /bin/bash -xはあなたがやりたいことをします。

0
Rory