次のものを使用することを忘れましたsudo
。
usr@arch ~[0] $ iptables -L
iptables v1.4.21: can't initialize iptables table `filter': Permission
denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
usr@arch ~[3] $ <---
私のものbash
PS1プロンプトは、最後のコマンド($?)の終了ステータスを反映します。これiptables
マンページ戻りコード3は関係ありません。
さまざまなエラーメッセージが標準エラーに出力されます。通常動作中は終了コードは0です。無効または誤ったコマンドライン引数が原因で発生したエラーの場合は終了コード2が発生し、他のエラーの場合は終了コード1が発生しているようです。
これSUSv3/POSIX議論するコマンドの終了ステータス。1mount
- エラー条件には7つの異なる終了ステータスがあります。 - マンページに記載されているように、権限なしで実行されたコマンドは1を返します。無効な呼び出しまたは権限。
頼む。
それでは、なぜこの点で違うiptables
のmount
ですか?純粋に特定のアプリケーション?strace
前の出力で次のような結果を実行するのはなぜですか?ソケット(PF_INET、SOCK_RAW、IPPROTO_RAW)= -1 EPERM(操作は許可されていません)- EACCESでなければなりませんか?許可されていない呼び出しを追跡してもmount
同様のエラーが表示されないこれら終了ステータスに影響しますか?それとも、理由にかかわらず-1は失敗ですか?この3つはどこから出たのですか?
1. さらに:牛に似た一種の栄養 Bash
;より一般的な;ランダム奇妙な;最近質問参照コードは特定のアプリケーション+歴史/usr/include/sysexits.hなど。
答え1
文書が不完全です。コードには、内部的に使用されるエラーコードの次のリストが含まれています。
enum xtables_exittype {
OTHER_PROBLEM = 1,
PARAMETER_PROBLEM,
VERSION_PROBLEM,
RESOURCE_PROBLEM,
XTF_ONLY_ONCE,
XTF_NO_INVERT,
XTF_BAD_VALUE,
XTF_ONE_ACTION,
};
初期化を試みるとき:
if (!*handle)
xtables_error(VERSION_PROBLEM,
"can't initialize iptables table `%s': %s",
*table, iptc_strerror(errno));
xtables_error
エラーメッセージを出力し、指定された終了コードで終了します。
IMHOコードに欠陥があるようです。ここでは、エラーがerrno
実際に何であるかを確認せずにバージョンの問題が原因であるとしますEPERM
。
答え2
終了コードの唯一の規則は、0は成功を意味し、他の値は失敗を意味することです。このルールはUnixを超えています。これは、他のオペレーティングシステム(DOS、Windows、および終了コードの概念を持つ多くの組み込みシステムを含みますが、VMSは異なる方法で実行されます)でも一般的なルールです。 Unixシステムでは、シェルのブール構造(、、、、、、、… )if
とすべてwhile
の標準ユーティリティに組み込まれています。 POSIX Cプログラムでは&&
||
!
set -e
make
EXIT_SUCCESS
0でEXIT_FAILURE
ゼロ以外の値(通常1)です。
失敗した場合、終了コードの選択に関する規則や普遍的な規則はありません。少数のPOSIXユーティリティだけが特定のエラー状態コードを強制します。
cmp
そしてdiff
個々のファイルの場合は1、エラー状態の場合は≥2を返します。expr
式が 0 または null と評価された場合は 1 を返し、式が無効な場合は 2 を返し、その他のエラーでは ≥3 を返します。grep
「見つかりません」の場合は1を返し、エラー条件の場合は≥2を返します。多くの検索コマンドがこれに従います(ただし、find
一致するファイルがない場合は0を返しません)。mesg
Yesの場合は0、Noの場合は1、エラーの場合は≥2を返します。patch
ブロックが拒否された場合は1を返し、その他のエラーの場合は≥2を返します。sort -c
ファイルデータがソートされていない場合は1を返し、エラーがある場合は≥2を返します。compress
そしてlocaledef
特定のエラーに対して小さな値を定義します。
大きな値がより深刻な失敗を意味するという共通の信念がありますが、普遍的ではありません。grep
(このパターンは存在しますか?)やdiff
(このファイルは同じですか)などのブール条件をテストするコマンドの場合、1は「いいえ」を意味し、値が高いほどエラーを示します。また、126で始まる値はシェルに書き込まれるため、ほとんど使用されません(、、およびcommand
)env
。nice
126及び127は外部コマンド呼び出しが失敗したことを示し、128以上の値はコマンドが終了したことを示す。信号で。nohup
time
$?
/usr/include/sysexits.h
sendmailから来たので、電子メールシステム、特にprocmailなどのメール配信エージェントでのみ見たことがあります。
多くのプログラムは常に1を返し、失敗した場合は常に2を返します。iptables
いくつかの異なるエラーコードを定義することがあります。
表示される戻り値strace
は次のとおりです。システムコール。システムコールはエラーを示すために-1を返し、エラーコードを次の場所に保存します。errno
変えるStrace はerrno
戻りコードの後の括弧内に値を表示します。EACCES
(「権限が拒否されました」)と(「操作が許可されていません」)の違いはEPERM
少し微妙です。EACCES
これは、ターゲットオブジェクトに対する権限が操作を許可しないことを意味し、他EPERM
の権限があることを意味します。問題(たとえば、オブジェクトにまったくアクセスできない、またはジョブがルートに制限される)