7

UNIXシェルでこれを行うとしましょう

$ some-script.sh | grep mytext

$ echo $?

これにより、終了コードが表示されますgrep

しかし、どうすれば終了コードを取得できますかsome-script.sh

編集

パイプ操作は不変であると仮定します。つまり、分割して 2 つのコマンドを別々に実行することはできません。

4

5 に答える 5

5

複数の解決策がありますが、正確に何をしたいかによって異なります。

最も簡単で理解しやすい方法は、出力をファイルに送信し、終了コードを保存した後に grep することです。

tmpfile=$(mktemp)
./some-script.sh > $tmpfile
retval=$?
grep mytext $tmpfile
rm tmpfile
于 2010-05-17T18:29:37.297 に答える
4

comp.unix.shell FAQ (#13)からのトリックは、Bourne シェルでパイプラインを使用すると、目的を達成するのにどのように役立つかを説明しています。

   You need to use a trick to pass the exit codes to the main
   shell.  You can do it using a pipe(2). Instead of running
   "cmd1", you run "cmd1; echo $?" and make sure $? makes it way
   to the shell.

   exec 3>&1
   eval `
     # now, inside the `...`, fd4 goes to the pipe
     # whose other end is read and passed to eval;
     # fd1 is the normal standard output preserved
     # the line before with exec 3>&1
     exec 4>&1 >&3 3>&- 
     {
       cmd1 4>&-; echo "ec1=$?;" >&4
     } | {
       cmd2 4>&-; echo "ec2=$?;" >&4
     } | cmd3
     echo "ec3=$?;" >&4
于 2011-01-25T06:04:56.730 に答える
2

bash を使用している場合:

PIPESTATUS
    An array variable (see Arrays) containing a list of exit status values from the processes in the most-recently-executed foreground pipeline (which may contain only a single command). 
于 2010-05-17T18:32:38.527 に答える
2

moreutilsパッケージmispipeの一部であるという名前のユーティリティがあります。

まさにそれを行います:mispipe some-script.sh 'grep mytext'

于 2012-11-11T12:37:56.447 に答える
0

最初のアプローチでは、終了ステータスを一時的にファイルに保存します。このため、中かっこを使用してサブシェルを作成する必要があります。

(your_script.sh.pl.others; echo $? >/tmp/myerr)|\ #subshell with exitcode saving
grep sh #next piped commands
exitcode=$(cat /tmp/myerr) #restore saved exitcode
echo $exitcode  #and print them

上記のRandyによって提示された別のアプローチ、より単純なコード実装:

some-script.sh | grep mytext
echo ${PIPESTATUS[0]} #print exitcode for first commands. tables are indexted from 0

そのすべて。両方とも bash で動作します (私は知っています、bashizm)。頑張ってください:)両方のアプローチは一時的にパイプを物理ファイルに保存せず、終了コードのみを保存します。

于 2013-08-23T07:23:05.090 に答える