特定の戻りコードをすぐに返すUnixコマンドは何ですか?

特定の戻りコードをすぐに返すUnixコマンドは何ですか?

次の例のような操作を実行できる標準のUnixコマンドはありますか?

$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$

<cmd here>フォーク実行が可能で、プロセスが終了したときに終了コードとして56を残すことができるはずです。exitそして、シェル組み込み機能はreturn終了することによって呼び出しシェル自体に影響を与えるため、私が探しているものには適していません。<some cmd>シェルではなくコンテキストで実行できるものでなければなりませんsubprocess

たとえば、/usr/bin/false常に戻りコード1を使用してすぐに終了しますが、戻りコードが何であるかを正確に制御したいと思います。独自のラッパースクリプトを作成して同じ結果を得ることができます。

$ cat my-wrapper-script.sh # i.e., <some cmd> = ./my-wrapper-script.sh
#!/usr/bin/bash
exit $1
$ ./my-wrapper-script.sh 56
$ echo $?
56

しかし、これを行うことができる標準のUnixコマンドがあればと思います。

答え1

  1. 機能ベースでreturn動作し、他のシェルを開閉する必要はありません(次による)。チームケネディのコメント):

    freturn() { return "$1" ; } 
    freturn 56 ; echo $?
    

    出力:

    56
    
  2. exitサブシェルで使用:

    (exit 56)
    

    他のシェルの場合、ksh93これは追加のプロセスを分岐することを意味するため、上記のプロセスよりも効率が悪くなります。

  3. bash//唯一のzshトリックksh93

    . <( echo return 56 )
    

    (これは追加のプロセス(およびパイプ付きIPC)も意味します)。

  4. zshラムダ関数:

    (){return 56}
    

答え2

特定の値のみを返す標準のUNIXコマンドはありません。 GNUコアユーティリティでのみ利用true可能ですfalse

ただし、これを直接簡単に実装できますret

#include <stdlib.h>
int main(int argc, char *argv[]) {
  return argc > 1 ? atoi(argv[1]) : 0;
}

編む:

cc ret.c -o ret

そして、以下を実行してください:

./ret 56 ; echo $?

印刷:

56

追加のツールをインストールせずにどこでも(つまり、bashが利用可能なすべての場所で)機能するには、アノテーションで@TimKennedyが提案したように、以下を使用することをお勧めします。

bash -c 'exit 56'

ご注意ください、戻り値の有効な範囲は0..255(含む)です。

答え3

コマンドを実行して終了状態を設定する必要がある場合。特別なcommand1ありませんが、任意の終了状態で終了できる任意の言語のインタプリタを使用できます。sh最も明白なのは次のとおりです。

sh -c 'exit 56'

ほとんどのsh実装では、これは終了コード0〜255に制限されています。shより大きな値は許可されますが、切り捨てられたり、shコード257〜320のksh93などの実行プロセスに信号が送信されることがあります。

終了コードは任意の整数()値にすることができますが、値が8ビットに切り捨てられないようにintインターフェイスを使用して取得する必要があります(Linuxではまだ切り捨てられます)。したがって、255より高い終了コードを使用することはまれで、良い考えではないのはなぜですか(通常の動作では0〜123を使用してください)。waitid()waitid()

または:

awk 'BEGIN{exit 56}'
perl -e 'exit 56'
python -c 'exit(56)'
expect -c 'exit 56'

(終了コードを8ビットに切り捨てません。)

NetBSDを使用すると、find次のことができます。

find / -exit 56

1はexitこれを行う標準コマンドですが、シェルとして特殊内蔵、通常の組み込みコマンドのように、ファイルシステムにその名前のコマンドがある必要はなく、ほとんどのシステムにはコマンドは含まれていません。

答え4

このコマンドの唯一の問題がexit現在のシェルを終了しているかどうかはわかりませんが、そうであればサブシェルが機能する可能性があります。

username@host$ $(exit 42)
username@host$ echo $?
42

Cygwin Bashでこれをテストしたところ、効果がありました。

編集:申し訳ありません。シェルコンテキストの外で実行している部分を見逃しました。この場合、スクリプトでラップして.sh環境で実行しないと役に立ちません。

関連情報