bashシェルとcshシェルで "ls"コマンドの終了ステータスが異なるのはなぜですか?

bashシェルとcshシェルで

なぜexit status違うの?強く打つそしてシェル? 、存在するls男性:

Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line
              argument).

exit statusコマンドをテストするためのファイルがlsあるとしますss。ワイルドカードを使用して、文字の状態に応じてファイルを一覧表示します。?

cshシェルから:

ls -d ss
ss

ls -d s?
ss

ls -d ?s
ss

ls -d ?z
ls: No match.

ls -d ?z | echo $?  #check exit status
0

大きな打撃を受けた場合:

ls -d ss
ss

ls -d s?
ss

ls -d ?s
ss

ls -d ?z
ls: cannot access ?z: No such file or directory

ls -d ?z | echo $?  #check exit status
2

これは同じコマンドですが、ls次の間にシャットダウン状態が異なります。csh shellbash

  • csh シェルの終了状態は次のとおりです。0
  • Bashの終了状態は次のとおりです。2

今質問は次のとおりです。

ls1)bashとcshシェルで同じコマンドの終了ステータスが異なるのはなぜですか?

2) bash と csh シェルのコマンド動作の違いはどういう意味ですか?

ベストアンサー1

まず、ls -d ?z | echo $?Bashで測定することはあなたが考えるものとは異なります。パイプラインはすべてすぐに開始され、その前にもパラメータ拡張が発生するため、echo $?戻りコードが印刷されます。より早いパイプの前のコマンドの代わりにコマンド。 cshはこれも行いません。その出力は意味がありません。別のコマンドで実行すると、ls -d ?z ; echo $?実際の終了コードに関する情報出力が得られます。

sh -c 'exit 53'目的の場所から実際に終了コードを取得しているかどうかをテストするコマンドとして機能します。


第二に、あなたは私たちに言わなかったが、最初の例のエラーはcshのように聞こえるので、それがすべてだと仮定します。この場合、ls -d ?zlsまったく実行されない;シェルのワイルドカード拡張が失敗し、No matchエラー( "")を報告してもコマンドは実行されません。デフォルトでは、Bashは一致しないワイルドカードを文字通り渡します。:実際に実行するとファイルが存在しないため、ls '?z'エラーが発生します。lsとにかく報告されたエラーコードは前の行から来ました。

したがって、lsコマンドは実行時にすべての場合で同じように機能しますが、時には実行されません。


Bashの(正直、悪い)動作を変更することができますそしてshopt -s failglob。 globが一致しない場合、エラーが発生します。

/tmp$ ls ?z
ls: cannot access '?z': No such file or directory
/tmp$ shopt -s failglob
/tmp$ ls ?z
bash: no match: ?z

最初は Bash 自体の終了コード 2 を持ちls、2 番目は$?Bash 自体の終了コード 1 を持ちます。

おすすめ記事