web-dev-qa-db-ja.com

Linuxの終了ステータスとすべてのステータスのリストとは

Linux bashスクリプトを学習しようとしていますが、 http://tldp.org サイトの記事を読んでいます。ある種のログクリアスクリプトを見たのですが、何かが終了ステータス。記事からいくつかのスクリプトスニペットを以下に示します。

#!/bin/bash
# Cleanup, version 3

#  Warning:
#  -------
#  This script uses quite a number of features that will be explained
#+ later on.
#  By the time you've finished the first half of the book,
#+ there should be nothing mysterious about it.

LOG_DIR=/var/log
ROOT_UID=0     # Only users with $UID 0 have root privileges.
LINES=50       # Default number of lines saved.
E_XCD=86       # Can't change directory?
E_NOTROOT=87   # Non-root exit error.

両方の変数がプログラムの予約済み終了ステータスコードを使用するかどうかにかかわらず、E_NOTROOT(86)およびE_XCD(87)は何をしますか?

OR

両方の変数がこの目的のために乱数を使用する場合。

参照: http://tldp.org/LDP/abs/html/abs-guide.html

1
Ajil Raju

すべての実行には終了ステータスがあります。一般に、ゼロはOKを意味し、ゼロ以外はエラーです。その値は、標準出力には自然に表示されません。コマンドを実行するたびに、echo $?と入力する値を確認できます。

たとえば、次のように入力します。

mkdir test;echo $?適切な権限がある場合は、ディレクトリを作成すると、ゼロが表示されます。

ただし、適切な権限を持ちながら「テスト」サブディレクトリを持たないmkdir testing/test;echo $?を書き込むと、エラーメッセージが表示され、次に「1」が表示されます。

コマンドは相互接続できるため、これはGNU/Linuxで非常に重要なツールです。また、(例として)コマンドの接続にダブルアンパサンドを使用する場合、2番目のコマンドは、最初のコマンドの出口で値がゼロの場合にのみ実行されます。コマンドを接続する方法はたくさんあります。詳細については、man bashと入力してください。

0
Juan

一般に、プロセスの終了ステータスはPOSIXによって8ビット(符号なし)整数値として定義されているため、可能な値は0から255までです。

WEXITSTATUS(stat_val) [This]マクロは、子プロセスが_exit()またはexit()に渡したステータス引数の下位8ビット、または子の値に評価されます。 main()から返されたプロセス。 wait(3p)

C標準では、2つの定数EXIT_SUCCESSおよびEXIT_FAILURE、これはexit()に渡され、それぞれ正常終了または失敗終了を示します。 exit(3)

従来、EXIT_SUCCESSはゼロに等しく、ゼロ以外の値はすべてエラーの兆候として扱われます。

ただし、Bashを含むPOSIXのようなシェルは、内部使用のために一連の高い終了ステータスを予約し、呼び出されたコマンドで問題が発生したことを通知します。そのコマンドは、明示的な終了ステータスを返す機会がありません( Bashマニュアル =):

シェルの目的のために、ゼロ終了ステータスで終了するコマンドが成功しました。ゼロの終了ステータスは成功を示します。ゼロ以外の終了ステータスは、失敗を示します。コマンドが致命的な信号Nで終了すると、bashは終了ステータスとして128 + Nの値を使用します。コマンドが見つからない場合、コマンドを実行するために作成された子プロセスはステータス127を返します。コマンドが見つかったが実行可能でない場合、戻りステータスは126です。

したがって、実際には、1〜125の任意の値を使用して、プログラム固有の方法でエラーを示すことができます。 @mosvyがコメントでほのめかしたように、いくつかの意味のある終了コードを標準化するための BSDによる努力 がありましたが、それは決して普遍的になりませんでした。これらの統合された終了コードは64から始まり、プログラム固有の使用のためにその値を下回るものはすべて残しました。最高の「標準化された」値は78でした。したがって、例で言及されている値が純粋に任意のプログラム固有のコードであることは明らかです。

1
TooTea