行ごとにbashスクリプトをどのように実行しますか?


92

bash -xオプションを入力すると、すべての行が表示されます。しかし、スクリプトは正常に実行されます。

行ごとに実行するにはどうすればよいですか?それが正しいことをするかどうかを確認するよりも、または中止してバグを修正します。同じ効果がreadすべての行に入れられます。


1
たぶんもっと広く見ると、stackoverflow.com
questions / 951336 / how

回答:


125

すべての行に読み取りを入力する必要はありません。次のようなトラップをbashスクリプトに追加するだけで、望みどおりの効果が得られます。

#!/usr/bin/env bash
set -x
trap read debug

< YOUR CODE HERE >

動作します。bashv4.2.8およびv3.2.25でテストしただけです。


改良版

スクリプトがファイルからコンテンツを読み取る場合、上記のリストは機能しません。回避策は次の例のようになります。

#!/usr/bin/env bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG

< YOUR CODE HERE >

この場合、スクリプトを停止するには、別のシェルからスクリプトを強制終了する必要があります。


代替1

スクリプトの次のコマンドに進む前に数秒だけ待機したい場合は、次の例が役立ちます。

#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG

< YOUR CODE HERE >

出力を読みやすくするために、trapコマンド内にset + xおよびset -xを追加しています。


1
次に、どのように次の行に進みます(次のコマンドを実行します)?
David Doria

2
すべてのコマンドの読み取りをトラップします。あなたがしなければならない唯一のことは、次のコマンドに到達するためにReturnキーを押すことです
Organic-Mashup

1
「while read line; do echo $ line; done <somefile」のようなコマンドラインがある場合、「trap read DEBUG」はsomefileから行を読み取るため、このメソッドは機能しません
mug896

3
どうやって止めるの?スクリプトを最後まで実行すると、シェルはスクリプトがまだ実行されているように動作します。
slashdottir 2016年

1
に変更してtrap 'read -u1' debug、ファイルの読み取りリダイレクトの問題をオーバーライドします。
user3132194

23

たぶん、BASH Debuggerはあなたのためのものです。


3
これは本当に最良の解決策です。実行する前に(そしてそれ以上に)行を表示できます。ほとんどのシステムでは、でインストールできますapt-get install bashdb。次にbashdb your_command.sh、を実行し、と入力してstep、その後キャリッジリターンを押すだけです。
studgeek 2017年

1
@studgeek Redhat / CentOSなどでは利用できないため、「ほとんどのシステム」とは呼びません。
2018

@Sajuuk、パッケージ化されていない可能性がありますが、絶対に利用可能です
Charles Duffy

macOS:brew install bashdb
boweeb

@CharlesDuffy:デフォルトのUbuntuリポジトリにもありません。
Dan Dascalescu

2

bashスクリプトが実際に1つずつ実行する一連のオフのコマンドである場合は、次のようにして、実行LNする行番号に対応する変数をインクリメントするときに各コマンドを1つずつ実行できます。 。これにより、最後のコマンドを再び非常に簡単に実行でき、変数をインクリメントして次のコマンドに進むことができます。

コマンドが「it.sh」ファイルにあると想定して、次のコマンドを1つずつ実行します。

$ cat it.sh
echo "hi there"
date
ls -la /etc/passwd

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1)
"hi there"

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1)
Wed Feb 28 10:58:52 AST 2018

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1)
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd


1

xargs:行をフィルタリングできます

cat .bashrc | xargs -0 -l -d \\n bash
  • -0生の入力として扱う(エスケープなし)
  • -l各行を区切ります(パフォーマンスではデフォルトではありません)
  • -d \\ n行区切り
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.