すべてのコマンドの終了ステータスを出力するようにbashを構成する方法は?


12

bashで実行されるすべてのコマンドは、終了コードを返します。

bashプロンプトでコマンドを入力するたびに、終了ステータスを表示する、つまり、 echo $?

たとえば、echo "hello";bashプロンプトで実行すると、出力は次のようになります。

linux@linux$ hello
linux@linux$ 0

unix.stackexchange.comに質問を投稿するのはどうですか?

@Frankに感謝します。しかし、この質問をするのにも良い場所ではないでしょうか?
ravidixit

PS1変数の一部として印刷しようとしましたが、まだ理解していない理由で機能しません。
ravidixit

回答:


13

最後に実行されたコマンドの終了コードは$?環境変数に保存されます。そのため、この変数をデフォルトのコマンドプロンプトに追加するだけで、そこに終了コードが常に出力されます。プロンプトは$PS1環境変数に保存されます。最初は/etc/bash.bashrcスクリプトで設定され、後で$HOME/.bashrc

そのため、デフォルト値から行を編集します$HOME/.bashrc/etc/bash.bashrcシステム全体になります)。

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

これに(たとえば):

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '

したがって、デフォルトのプロンプトは次のように変更されます。

user@host:/path/to/dir[0] $

括弧内の0は終了コードです。以下を参照してください。

user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $

意味については、http: //www.tldp.org/LDP/abs/html/exitcodes.htmlを参照してください


私はそれを試してみましたが、手元のbashに対しては機能しません。作業中のマシンでは常に[0]が表示されます。
ravidixit

bashを実行してもよろしいですか?readlink /proc/$$/exeplease の出力をコピーできますか?0はエラーがないことを意味します。エラーが発生する何かを試しましたか:^Cまたはfalseまたはasdasdasd
カオス

1
@chaos私はPS1をとして持っていますが、常にPS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end")表示され0ます。理由は何ですか?
最大

1
終了ステータスのみが表示される場合、等しくない0
rubo77

1
@maxこれ$?0、の設定時にが既に展開されているためPS1です。行いecho $PS1、あなたが表示されます。単一引用符を使用するか、のようにエスケープする必要があり\$?ます。
ウィスバッキー

7

私はから選んだことを別の方法アーチのWikiを使用することにしましたtrap

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR

効果:

$ ( exit 1 )
code 1

$ some-non-existent-command
some-non-existent-command: command not found
code 127

$

2
彼はゼロであっても終了ステータスを出力したいので、それはOPの要件を完全には満たしていませんが、まさに私が探していたものです。
キーストンプソン14年

2

以下に簡単な例を示します。

PS1='$? > '

二重引用符を使用する場合、バックスラッシュを追加してエスケープする必要があります$

PS1="\$? > "

出力:

0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 > 

さらに良い方法は、ゼロ以外の場合にのみ終了コードを出力することです。

PS1='${?#0}> '    # single quote example
PS1="\${?#0}> "   # double quote example (requires extra backslash)

サンプル出力:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

説明:${var#pattern}は、bashパラメーター拡張であり、$ varの先頭から最短一致パターンを削除することを意味します。そのため、この場合、0の前から削除し$?ます0。これにより、の終了コードが効果的に切り捨てられます。

二重引用符を使用する場合、毎回評価されるのではなく、が設定されている$?ときに置換PS1されます。にecho $PS1ハードコードされた値がないことを確認してくださいPS1


2018年1月からありがとうございます。ゼロ以外の場合は、先頭に終了コードを含む通常のプロンプトが必要です。これは非常に役立ちます。
–SDsolar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.