
私は現在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
出力されます。stderr
stdout
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`の違いは何ですか?より多くの情報を知りたいです。
「何」stdout
、stderr
「何」、「2>&1
何」が何をしているのかについては、Wikipediaのページをご覧ください。標準ストリームそしてリダイレクト。
答え3
この変数var
には以下が含まれます。ANSIエスケープコードこれにより、1行上に移動します。
次の例を使用して出力を再現できます。
var=$'\033[FSyntax OK\n'
echo "Output is $var"
これで以下が生成されます。
Syntax OK
Output is
最初の行は、上記の2行を含むスクリプトのプロンプトを上書きします。