すべてのコマンドが機能しているか機能していない場合、フィードバックを送信できますか?


11

コマンドを実行しても出力が表示されない場合があるため、コマンドが機能したかどうかはわかりません。コマンドが正しく実行されたかどうかにかかわらず、すべてのコマンドにフィードバックを設定することは可能ですか?または、実行したフィードバックIDを表示するための最低限(正確かどうか)


6
一般的な考え方は、フィードバックがないことを意味します。
リンツウィンド14

1
これは厳密には正しくありません。たとえば、cryptsetupデフォルトで一部のエラーメッセージをスキップできます。$?あなたのにあるのは良いことPS1です。次のステップでは、現在の時刻も追加し、コマンドのタイミングを常に把握します;)
d33tah 14

回答:


11

Ask Ubuntuに投稿しているので、デフォルトのシェル、つまりBashについて話していると仮定できます。)

Stack Overflowの質問には非常に良い答えがあります。シェルスクリプトの場合:実行されるシェルコマンドをエコーし​​ます(これはUbuntu固有のソリューションではありません)。

行う必要があるのは、setコマンドを使用して、verboseまたはxtraceをオンにすることです。

set -o

現在のパラメータがオンまたはオフに切り替えられるリストが表示されます。

set -v

またはlongformバージョン:

set -o verbose

冗長ONになります。

ただし、実際に必要なのはxtraceです。これにより、実行するすべてのコマンドがエコーされるだけでなく、パラメーターが拡張され、より多くのフィードバックが提供されます。したがって、ターミナルで「hi」と入力するのと同じくらいばかげたことをすると、入力した内容のエコーと、シェルがコマンド「hi」を実行しようとしたときのレポート/トレースが表示されます(下のスクリーンショットを参照) ):

ここに画像の説明を入力してください

xtraceを有効にするには:

set -x

または:

set -o xtrace

これらのパラメーターを無効にするには、ダッシュまたはマイナス記号の代わりにプラス記号+を使用することを除いて、同じコマンドを(反直感的に)呼び出します。たとえば、

set +v

同様に冗長OFFになります:

set +x

xtraceをオフにします。


シェルオプションの詳細なガイドは、第33章「オプション、高度なBashスクリプトガイド」にあります。


1
しかし、コマンドが正しい場合、どのように機能しますか?出力はありますか?コマンドを言うwhoami >/dev/null
登録ユーザー14

はい、もちろんそうです。入力した内容に加えて、コマンドを呼び出すときにサイレントモードで呼び出されたコマンドに関連する追加のパラメーターがエコーされます。あなたが意味するなら、それは「成功」を印刷しますか、そして悲しいことに、いいえ、Avinash Rajの答えはそれをします。
ベンジャミンR 14

@PeterMortensenは、私の回答の微妙な編集に感謝します。
ベンジャミンR 14

13

いくつかのコマンドが正常に機能したかどうかを確認するには、次のコマンドを使用して、前のコマンドのreturnステータスを確認できます$?

echo $?

戻りステータス0は、コマンドが正常に完了したことを意味し、ゼロ以外の出力(エラーコード)は、いくつかの問題が発生したか、エラーがあり、エラーコードからカテゴリを知ることができることを意味します。Linux / Cエラーコードは/usr/include/asm-generic/errno-base.hおよびで定義されてい/usr/include/asm-generic/errno.hます。

またbashでは、完了のステータスを通知するために使用できる.bashrcエイリアスalertを定義します。次のようなコマンドまたはコマンドコンボでエイリアスを添付する必要があります。

some_command --some-switch; alert

次のコード行を~/.bashrcファイルに追加して、最後に実行されたコマンドの戻りステータスを表示できます。

# show the return code of last command executed
PS1='${debian_chroot:+($debian_chroot)}\u@\h(lst ret. $(echo $?) ):\w\$ '

~/.bashrc選択したテキストエディタでファイルを開き、上記の行をコピーしてファイルに貼り付けて保存します。ターミナルの新しいインスタンスを起動すると、動作するはずです。代わりに、関数を定義して使用することもできます。それとPS1下図のようにのように。)

ちょっとしたデモ:

hash@precise(lst ret. 0 ):~$ ls -sh someFileThatsNotThere
ls: cannot access someFileThatsNotThere: No such file or directory
hash@precise(lst ret. 2 ):~$ 
hash@precise(lst ret. 2 ):~$ aCommandThatsNot
aCommandThatsNot: command not found
hash@precise(lst ret. 127 ):~$ 
hash@precise(lst ret. 127 ):~$ echo "you should get a lst ret. 0, I believe the system has echo installed :)"
you should get a lst ret. 0, I believe the system has echo installed :)
hash@precise(lst ret. 0 ):~$
hash@precise(lst ret. 0 ):~$ sudo touch /tmp/someTestFile
[sudo] password for hash: 
hash@precise(lst ret. 1 ):~$
hash@precise(lst ret. 1 ):~$ chown $USER:$USER /tmp/someTestFile 
chown: changing ownership of `/tmp/someTestFile': Operation not permitted

で遊んでくださいPS1:)もう少し、

function showRetStat {
## line1: initiliazing retStat with the return status of the previous command
retStat=$?
## line2: Left padding the return status with spaces. If you prefer the unpadded one, you can just replace
# $retStatFtd in the lines initializing noErrStr and errStr among other possible ways.
retStatFtd=$(sed -e :a -e 's/^.\{1,2\}$/ &/;ta' <<< $retStat)
## lines3&4: Setting the strings to display for a successful and unsuccessful run of previous command
# which we are going to display with the prompt string. Change the strings to display text of your
# choice like you may set noErrStr="yippie!" , errStr="oopsie!" in place of what they're now.
noErrStr="retStat "$retStatFtd" :: PASS ^_^"
errStr="retStat "$retStatFtd" :: FAIL x_x"
## line5: Applying the logic and display the proper string at the prompt. Space padded number i.e. retStatFtd, here,
# worked in the logic, originally I intended to use this for the display while retStat in the conditional
# check; you could make the function one statement less if you want to.
echo "$([ $retStatFtd = 0 ] && echo "$noErrStr" || echo "$errStr")"
}

## Combining the function showRetStat into the prompt string.
PS1='${debian_chroot:+($debian_chroot)}\u@\h($(showRetStat)):\w\$ '

(@gronostajが彼の投稿で行っているように、関数をより凝ったものに変更することができます。)


2
あなたの拡張された回答と例が本当に好きです。私はOPがxtraceを望んでいると確信していますが、個人的にはこれは自分のコマンドラインプログラムをデバッグするのに役立ち、他の人をよく理解するでしょう。
ベンジャミンR 14

1
常に同じ長さになるように、戻り値を左詰めにすることをお勧めします。
o0 '。

変更の場合は+1 PS1。最後のコマンドが成功した場合、これはエラーの場合は赤の数、何も余分に、1つのIの使用である:\[\033[01;41;37m\]${?#0}\[\033[00;01;36m\] \u@\h:\w\[\033[00m\]\$
カルロスCampderrós

1
@rustyは~/.bashrcファイルをソースする必要がないということ ですか?
アビナッシュラジ14

2
はい、PS1の変更は便利で非常に柔軟です。^_^成功すると幸せになり、x_xそれ以外は赤になります。
イズカタ14

5

前のコマンドが0で終了し、それ以外の場合は赤色のXで終了するときに、緑色のチェックマークを表示するようにコマンドプロンプトを変更できます。Arch Linux Wikiには、以下に追加するコードがいくつかありますbash.rc

set_prompt () {
    Last_Command=$? # Must come first!
    Blue='\[\e[01;34m\]'
    White='\[\e[01;37m\]'
    Red='\[\e[01;31m\]'
    Green='\[\e[01;32m\]'
    Reset='\[\e[00m\]'
    FancyX='\342\234\227'
    Checkmark='\342\234\223'

    # Add a bright white exit status for the last command
    #PS1="$White\$? "
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $Last_Command == 0 ]]; then
        PS1+="$Green$Checkmark "
    else
        PS1+="$Red$FancyX "
    fi
    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    if [[ $EUID == 0 ]]; then
        PS1+="$Red\\h "
    else
        PS1+="$Green\\u@\\h "
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+="$Blue\\w \\\$$Reset "
}
PROMPT_COMMAND='set_prompt'

(正確なコードを表示したい場合は#、この行から削除するだけです。#PS1="$White\$? "

外観は次のとおりです。

GUIターミナルのスクリーンショット

ttyスクリーンショット


2

はい、端末で実行したすべてのコマンドのフィードバックを取得することができます。コマンドがecho $?正常に完了した場合は0を返し、失敗した場合は0以外の値を返します。

成功または失敗のフィードバックを取得するには、~/.bashrcファイルに次の行を追加します。

bind 'RETURN: ";if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;\n"' 

次に、ソース~/.bashrcファイルを使用して動作させます。

source ~/.bashrc

説明:

ターミナルで実行したコマンドごとに、この;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;コードは自動的にバインドされます。

例:

$ sudo apt-cache policy firefox;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
firefox:
  Installed: 24.0+build1-0ubuntu1
  Candidate: 24.0+build1-0ubuntu1
  Version table:
 *** 24.0+build1-0ubuntu1 0
        500 http://ubuntu.inode.at/ubuntu/ saucy/main amd64 Packages
        100 /var/lib/dpkg/status
SUCCESS

$ suda apt-get update;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
No command 'suda' found, did you mean:
 Command 'sudo' from package 'sudo-ldap' (universe)
 Command 'sudo' from package 'sudo' (main)
 suda: command not found
FAILURE

ここに画像の説明を入力してください


1
bind 'RETURN: " && echo SUCCESS || echo FAILED \n"'また、同じことを行います[[ $? == 0 ]]。明示的に確認する必要はありません。
souravc

ただし、C / Linux標準および「Success」に対応する英語の文法標準は不合格になります。
ベンジャミンR 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.