GNU/Linux >> Linux の 問題 >  >> Linux

Bashコマンドラインの終了コードがわかりやすく説明されています

コマンドを実行するかスクリプトを実行すると、終了コードを受け取ります。 。終了コードは、成功、エラー、またはコマンドまたはスクリプトから予期しない結果を引き起こした原因についての手がかりを提供する別の条件を報告するシステム応答です。ただし、誰かがそうするように要求しない限り、終了コードはそれ自体を明らかにしないため、コードについて知らないかもしれません。プログラマーは、終了コードを使用してコードのデバッグを支援します。

注: 終了コードがよく表示されます 終了ステータスと呼ばれます または終了ステータスコードとしても 。これらの用語は、ドキュメントを除いて同じ意味で使用されます。うまくいけば、2つの用語の私の使用があなたに明らかになるでしょう。

私はプログラマーではありません。それを認めるのは難しいですが、それは本当です。私はBASIC、FORTRAN、およびその他のいくつかの言語を公式にも非公式にも勉強しましたが、私は間違いなくプログラマーではないと言わざるを得ません。確かに、PHP、Perl、Bash、さらにはPowerShellでスクリプトとプログラミングを少し行うことはできますが(はい、私はWindows管理者でもあります)、コードの記述が遅すぎるため、プログラミングで生計を立てることはできませんでした。試行錯誤は効率的なデバッグ戦略ではありません。本当に悲しいことですが、私は必要なタスクを実行できるように、見つかったコードをコピーして適応させるのに十分な能力があります。それでも、終了コードを使用して、問題がどこにあるのか、なぜ問題が発生しているのかを把握しています。

[次のこともお勧めします:コマンドラインでのSSHファイルのコピーの魔法。 ]

終了コードはある程度有用ですが、あいまいな場合もあります。たとえば、終了コード1は、その他のエラーの一般的なバケットであり、まったく役に立ちません。この記事では、いくつかの予約済みエラーコードについて説明します。 、それらがどのように発生する可能性があるか、そしてそれらを使用して問題が何であるかを理解する方法。予約済みのエラーコードはBashによって使用されるものであり、それらと競合する独自のエラーコードを作成しないでください。

十分な裏話。エラーコード/ステータスを生成するものの例を見てみましょう。

とらえどころのない終了コードの抽出

コマンドラインで最後に実行したコマンドの終了コードを表示するには、次のコマンドを使用します。

$ echo $?

表示される応答には、華やかさや状況は含まれていません。単なる数字です。 Bashからエラーをさらに説明するシェルエラーメッセージを受け取ることもありますが、終了コードとシェルエラーを一緒に使用すると、何が問題だったのかを見つけるのに役立ちます。

終了ステータス0

一般的に言えば、終了ステータス0が最良のシナリオです。最新のコマンドまたはスクリプトが正常に実行されたことを示します。終了コードはスクリプトまたはコマンドが正常に実行されたことを通知するだけであるため、成功は相対的ですが、終了コードはそこからの情報に値があるかどうかを通知しません。例は、私が説明していることをよりよく説明します。

一例として、ホームディレクトリ内のファイルを一覧表示します。ホームディレクトリには隠しファイルと隠しディレクトリ以外は何もないので、ここには何も表示されませんが、終了コードはコマンドの実行の成功以外は何も気にしません:

$ ls
$ echo $?
0

終了コード0は、lsを意味します コマンドは問題なく実行されました。繰り返しになりますが、終了コードからの情報は私にとって実際の価値を提供しません。

次に、lsを実行します /etcのコマンド ディレクトリを作成し、終了コードを表示します:

$ ls /etc
**Many files**
$ echo $?
0

実行が成功すると、終了コードが0になることがわかります。これには、catの発行などの完全に間違ったものも含まれます。 lsなどのバイナリ実行可能ファイルに対するコマンド コマンド:

$ cat /usr/bin/ls
**A lot of screen gibberish and beeping**
$ echo $?
0

終了ステータス1

上記の例を使用しますが、長いリストと再帰オプションを追加します(-lR )、1の新しい終了コードを受け取ります:

$ ls -lR /etc
**A lengthy list of files**
$ echo $?
1

コマンドの出力はすべてうまくいったように見えますが、上にスクロールすると、リストにいくつかの「アクセスが拒否されました」というエラーが表示されます。これらのエラーにより、終了ステータスが1になります。これは、「許可されていない操作」と呼ばれます。次のセクションで説明するように、「アクセスが拒否されました」というエラーが終了ステータス1になると予想される場合もありますが、それは間違いです。

ただし、ゼロで除算すると、終了ステータスは1になります。また、実行している操作が「許可されていない」ことを通知するエラーをシェルから受け取ります。

$ let a=1
$ let b=0
$ let c=a/b
-bash: let: c=a/b: division by 0 (error token is "b")
$ echo $?
1

最初の例からわかるように、シェルエラーがなければ、終了ステータス1はあまり役に立ちません。 2番目の例では、Bashがシェルエラーメッセージで通知するため、エラーを受け取った理由がわかります。一般に、終了ステータスが1の場合は、許可されていない操作を探します(許可が拒否されました メッセージ)成功と混合(/etcの下にあるすべてのファイルを一覧表示するなど) 、このセクションの最初の例のように)。

終了ステータス2

上記のように、「アクセスが拒否されました」というシェル警告の結果、終了ステータスは1ではなく2になります。これを証明するには、/rootにファイルをリストしてみてください。 :

$ ls /root
ls: cannot open directory '/root': Permission denied
$ echo $?
2

終了ステータス2は、権限に問題があるか、コマンドまたはスクリプトにキーワードがない場合に表示されます。欠落しているキーワードの例は、doneを追加するのを忘れていることです スクリプトのdo ループ。この終了ステータスでスクリプトをデバッグするための最良の方法は、対話型シェルでコマンドを発行して、受け取ったエラーを確認することです。この方法は通常、問題がどこにあるかを明らかにします。

パーミッションの問題は、他のタイプの問題よりも解読とデバッグが少し難しくありません。 「権限が拒否されました」とは、コマンドまたはスクリプトが権限の制限に違反しようとしていることだけを意味します。

終了ステータス126

終了ステータス126は、興味深いアクセス許可エラーコードです。このコードがいつ表示されるかを示す最も簡単な方法は、スクリプトファイルを作成し、そのファイルに実行権限を与えることを忘れることです。結果は次のとおりです。

$ ./blah.sh
-bash: ./blah.sh: Permission denied
$ echo $?
126

この権限の問題は、モードの場合と同様に、アクセスの問題ではなく、設定の問題です。このエラーを取り除き、代わりに終了ステータス0を受け取るには、chmod +x blah.shを発行します。 。

注: 実行可能ファイルに内容が含まれていない場合でも、終了ステータスは0になります。先に述べたように、「成功」は解釈の余地があります。

終了ステータス126を受け取りました。このコードは、よりあいまいなコードとは異なり、実際には何が問題なのかを教えてくれます。

終了ステータス127

終了ステータス127は、コマンドが存在しないか、コマンドがパス($PATH)にないかのいずれかが発生したことを示しています。 )。このコードは、現在の作業ディレクトリにあるコマンドを実行しようとした場合にも表示されます。たとえば、実行権限を付与した上記のスクリプトは現在のディレクトリにありますが、スクリプトをどこにあるかを指定せずに実行しようとしています:

$ blah.sh
-bash: blah.sh: command not found
$ echo $?
127

この結果がスクリプトで発生する場合は、問題の実行可能ファイルまたはスクリプトに明示的なパスを追加してみてください。実行可能ファイルまたはスクリプトを指定する場合も、スペルは重要です。

[読者も楽しんだ:知っておく必要のある10の基本的なLinuxコマンド。 ]

終了ステータス128

終了ステータス128は、範囲外の終了コードがプログラミングで使用されたときに受信される応答です。私の経験では、終了ステータス128を生成することはできません。例として複数のアクションを試しましたが、それを実現できません。ただし、終了ステータス128に隣接するコードを生成することはできます。終了コードが256を超える場合、返される終了ステータスは、終了コードから256を引いたものになります。この結果は奇妙に聞こえ、実際には誤った終了ステータスを作成する可能性があります。例を確認して、自分の目で確かめてください。

261の終了コードを使用して、5の終了ステータスを作成します。

$ bash
$ exit 261
exit
$ echo $?
5

誤った終了ステータス0を生成するには:

$ bash
$ exit 256
exit
$ echo $?
0

終了コードとして257を使用する場合、終了ステータスは1などになります。終了コードが負の数の場合、結果の終了ステータスは256からその数を引いたものになります。したがって、終了コードが20の場合、終了ステータスは236になります。

困ったですね。私にとっての解決策は、予約されて範囲外の終了コードを使用しないようにすることです。適切な範囲は0〜255です。

終了ステータス130

プログラムまたはスクリプトを実行していて、Ctrl-Cを押して停止した場合、終了ステータスは130です。このステータスは簡単に証明できます。 ls -lR /を発行します 次に、すぐにCtrl-Cを押します:

$ ls -lR /
**Lots of files scrolling by**
^C
$ echo $?
130

これについて言うことは他にあまりありません。これはあまり有用な終了ステータスではありませんが、ここでは参照用です。

終了ステータス255

この最終予約済み終了ステータスは、作成は簡単ですが、解釈が困難です。私が見つけたドキュメントには、0〜255の範囲外の終了コードを使用すると終了ステータス255が返されると記載されています。

このステータスは他の方法でも生成できることがわかりました。 1つの例を次に示します。

$ ip
**Usage info for the ip command**
  
$ echo $?
255

一部の独立した当局は、255が一般的な障害エラーコードであると言います。私はその声明を確認も否定もできません。オプションなしで特定のコマンドを実行することによって終了ステータス255を生成できることだけを知っています。

[関連記事:知っておく必要のある10のより重要なLinuxコマンド。 ]

まとめ

これで完了です。予約された終了ステータス番号の概要、それらの意味、およびそれらの生成方法。私の個人的なアドバイスは、終了ステータスコードに依存するのではなく、特にスクリプトで実行するもののアクセス許可とパスを常に確認することです。私のデバッグ方法は、コマンドがスクリプトで正しく機能しない場合、インタラクティブシェルでコマンドを個別に実行することです。この方法は、休憩と終了を伴う派手な戦術を試すよりもはるかにうまく機能します。 (ほとんどの場合)私のエラーは権限に関連しているため、このルートを使用します。そのため、そこから開始するようにトレーニングされています。

ステータスを確認して楽しんでください。今度は終了します。

[Red Hat Enterprise Linuxを試してみませんか?今すぐ無料でダウンロードしてください。 ]


Linux
  1. コマンドライン(bash)の「And」の違い??

  2. 5 Linux Bash コマンドラインで利用可能な標準補完

  3. 最後の終了コードを含む Bash プロンプト

  1. Bashのコマンド置換への変数代入の終了コード

  2. docker run へのコマンドライン引数

  3. -e は bash シバンで何をしますか?

  1. コマンドラインでの毎日のBashのヒント

  2. LinuxでBASHコマンドライン履歴をクリアする方法

  3. バッシュ演算子の違い[[Vs[Vs(Vs((?