私は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)の両方がプログラムの予約済み終了ステータスコードを使用している場合はどうなりますか?
または
両方の変数がこの目的で乱数を使用する場合です。
答え1
通常、すべてのプロセスの終了ステータスはPOSIXによって8ビット(符号なし)整数値として定義されるため、可能な値は0から255(含む)です。
WEXITSTATUS(stat_val)
_exit()
[この]マクロは、子プロセスと送受信状態パラメータの下位8ビットまたは子exit()
プロセスから返された値を評価しますmain()
。ちょっと待って(3p)C標準は、終了成功または失敗をそれぞれ示すためにexit()に渡すことができる2つの定数を
EXIT_SUCCESS
指定します。EXIT_FAILURE
出口(3)
通常、ゼロにEXIT_SUCCESS
等しく、ゼロ以外のすべての値は、誤った符号として扱われます。
ただし、Bashを含むPOSIXに似たシェルは、内部使用のために一連の高い終了状態を維持し、コマンドが明示的な終了状態を返す機会なしに呼び出されたコマンドで問題が発生したことを示します(バッシュマニュアル):
シェルの場合、終了ステータス0で終了したコマンドは成功しました。終了ステータス 0 は成功を示します。ゼロ以外の終了状態は失敗を示します。コマンドが致命的な信号Nで終了すると、bashは終了状態として128 + Nの値を使用します。コマンドが見つからない場合、コマンドを実行するために生成されたサブプロセスは状態127を返します。コマンドが検出されたが実行可能でない場合、戻り状態は 126 です。
実際には、1から125の間の値は、プログラムごとにエラーを示すために使用され得る。 @mosvyがコメントで暗示したように、BSDの努力いくつかの意味のある終了コードを標準化しましたが、一般的には使用されませんでした。これらの均一な終了コードは64から始まり、それ以下のコードはプログラム固有の使用のために予約されています。 「正規化された」最も高い値は78なので、例に記載されている値は純粋にランダムなプログラム固有のコードであることは明らかです。
答え2
すべての実行に終了ステータスがあります。通常、0 は正常を意味し、0 以外の場合はエラーを意味します。この値はデフォルトでは標準出力には表示されません。echo $?
実行された各コマンドの後、この値の入力を見ることができます。
たとえば、次のように入力すると:
mkdir test;echo $?
正しい権限がある場合、ディレクトリを作成すると0が表示されます。
mkdir testing/test;echo $?
ただし、正しい権限で作成したが「test」サブディレクトリなしで作成すると、エラーメッセージが表示され、次に「1」が表示されます。
コマンドが相互接続できるため、これはGNU / Linuxにとって非常に重要なツールです。そして(たとえば)デュアルアンパサンドを使用してコマンドをリンクすると、2番目のコマンドは、終了時に最初のコマンドの値が0の場合にのみ実行されます。コマンドをリンクする方法はいくつかあります。詳しくは、入力してください。man bash