スクリプトからコマンド出力を読み取る方法

スクリプトからコマンド出力を読み取る方法

私は現在Linuxスクリプトを学んでいますが、私ができることの1つはコマンド出力を変数に割り当てることです。コマンドがservice httpd configtest返されたので、Syntax is OKこう書いています。

#!/bin/bash

var=`service httpd configtest`
echo "Output is $var"

私が読んだところによれば、出力は保存され、再びエコーされなければvarなりません。ただし、スクリプトを実行したときの出力は次のとおりです。

Syntax OK
Output is

私は何が間違っていましたか?違いがある場合は、CentOS 6.5を使用しています。

答え1

これを実行すると、service httpd configtest実際に次のコマンドが実行されますapachectl configtest

  ....
  apachectl=/usr/sbin/apachectl  
  ....
  graceful|help|configtest|fullstatus)
        $apachectl $@
        RETVAL=$?
        ;;
  ....

何かを作るstrace

$ strace -f -e trace=write apachectl configtest
Process 22999 attached (waiting for parent)
Process 22999 resumed (parent 22998 ready)
[pid 22999] write(1, "1024\n", 5)       = 5
Process 22999 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
Process 23000 attached (waiting for parent)
Process 23000 resumed (parent 22998 ready)
Process 22998 suspended
[pid 23000] write(2, "Syntax OK\n", 10Syntax OK
) = 10
Process 22998 resumed
Process 23000 detached
--- SIGCHLD (Child exited) @ 0 (0) ---

ご覧のとおり、出力は記録され、出力はSyntax OK変数stderrに保存されません。var

stderrリダイレクトでこれを行うことができますstdout

var=$(service httpd configtest 2>&1)

答え2

私の推測では代わりにservice httpd configtest出力されます。stderrstdout

var=$(service httpd configtest 2>&1)
echo "Output is $var"

あるいは、変数なしで次のようにすることもできます。

echo -n "Output is "
service httpd configtest 2>&1

echoオプションは、出力が同じ行になるように-n末尾の改行を抑制します。service httpd configtest

`...`また、$(...)バックティックはいくつかの問題を引き起こす可能性があり、通常は使用されていないと見なされるため、上記でバックティック()を切り替えました。バラより$(stuff)と `stuff`の違いは何ですか?より多くの情報を知りたいです。

「何」stdoutstderr「何」、「2>&1何」が何をしているのかについては、Wikipediaのページをご覧ください。標準ストリームそしてリダイレクト

答え3

この変数varには以下が含まれます。ANSIエスケープコードこれにより、1行上に移動します。

次の例を使用して出力を再現できます。

var=$'\033[FSyntax OK\n'
echo "Output is $var"

これで以下が生成されます。

Syntax OK
Output is

最初の行は、上記の2行を含むスクリプトのプロンプトを上書きします。

関連情報