以下の私の例と同様のことを行う標準のUnixコマンドはありますか
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
<cmd here>
は、フォーク実行できるもので、プロセスの終了時に終了コードとして56を残す必要があります。 exit
およびreturn
Shellビルトインは、シェルを終了することによって呼び出し元のシェル自体に影響を与えるため、私が探しているシェルには適していません。 <some cmd>
は、シェル以外のコンテキストで実行できるものである必要があります-たとえば、Pythonスクリプトを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コマンドが存在することを期待しています。
return
ベースの関数が機能し、別のシェルを開いたり閉じたりする必要がなくなります( Tim Kennedyのとおり)のコメント ):
freturn() { return "$1" ; }
freturn 56 ; echo $?
出力:
56
サブシェルでexit
を使用:
(exit 56)
ksh93
以外のシェルでは、追加のプロセスをフォークすることを意味するため、上記よりも効率が低くなります。
bash
/zsh
/ksh93
のみのトリック:
. <( echo return 56 )
(これは、追加のプロセス(およびIPC with a pipe))も意味します)。
zsh
のラムダ関数:
(){return 56}
特定の値を返すだけの標準的なUNIXコマンドはありません。 GNU Core Utiliesは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'
実行したコマンドによって終了ステータスを設定する必要がある場合。そのための専用のコマンドはありません1ただし、任意の終了ステータスで終了する機能を持つ任意の言語のインタープリターを使用できます。 sh
が最もわかりやすいものです。
_sh -c 'exit 56'
_
ほとんどのsh
実装では、終了コード0〜255に制限されます(sh
はより大きな値を受け入れますが、値を切り捨てるか、コード257〜320のksh93のようにsh
を実行しているプロセスに信号を送信することもあります)。
終了コードは任意の整数(int
)値にすることができますが、waitid()
インターフェースで取得する必要があるため、値が8ビットに切り捨てられない(Linuxでは、waitid()
も同様です)。したがって、255を超える終了コードを使用することはまれである(そして、良い考えではない)理由(通常の操作には0〜123を使用)。
または:
_awk 'BEGIN{exit 56}'
Perl -e 'exit 56'
python -c 'exit(56)'
expect -c 'exit 56'
_
(これらは8ビットに終了コードを切り捨てません)。
NetBSD find
では、次のことができます。
_find / -exit 56
_
1exit
はそれを行うための標準コマンドですが、シェル特別な組み込みであり、通常の組み込みのようにファイルシステムにその名前のコマンドが存在する必要はありません。ほとんどのシステムでは、 1つを含む
/* Public domain, http://creativecommons.org/publicdomain/zero/1.0/ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv) {
if(!strcasecmp(argv[0],"true")) return 0;
else if (!strcasecmp(argv[0],"false")) return 1;
else if(argc<2) {fputs("One argument required\n",stderr);return 1;}
else if(!strcasecmp(argv[argc-1],"true")) return 0;
else if(!strcasecmp(argv[argc-1],"false")) return 1;
else return atoi(argv[argc-1]);
}
これをreturncode.c
およびgcc -o returncode returncode.c
という名前のファイルに保存します
exit
コマンドの唯一の問題が現在のシェルを終了することであるかどうかは正確にはわかりませんでしたが、そうであればサブシェルが機能する可能性があります。
username@Host$ $(exit 42)
username@Host$ echo $?
42
これをCygwin Bashでテストしたところ、うまくいきました。
編集:申し訳ありませんが、シェルコンテキストの外で実行する部分を逃しました。その場合、これを.sh
スクリプト内にラップして、環境からそれを実行しないと役に立ちません。