web-dev-qa-db-ja.com

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

以下の私の例と同様のことを行う標準の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コマンドが存在することを期待しています。

29
Chris
  1. returnベースの関数が機能し、別のシェルを開いたり閉じたりする必要がなくなります( Tim Kennedyのとおり)のコメント ):

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

    出力:

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

    (exit 56)
    

    ksh93以外のシェルでは、追加のプロセスをフォークすることを意味するため、上記よりも効率が低くなります。

  3. bash/zsh/ksh93のみのトリック:

    . <( echo return 56 )
    

    (これは、追加のプロセス(およびIPC with a pipe))も意味します)。

  4. zshのラムダ関数:

    (){return 56}
    
40
agc

特定の値を返すだけの標準的な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'

有効な戻り値の範囲は0..255を含む です。

17
tmh

実行したコマンドによって終了ステータスを設定する必要がある場合。そのための専用のコマンドはありません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つを含む

14
/* 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という名前のファイルに保存します

3

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

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

これをCygwin Bashでテストしたところ、うまくいきました。

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

0
Mihir