Linuxでは、次のCDが正常に機能するため、CDをtmpに挿入します。
/ # cd /tmp
tmp #
しかし、これは機能しません(rootのままで、/ var/log/messagesには何も表示されません)。何故なの?
/ # cd /tmp 2>&1 | /usr/bin/logger -t Test
/ #
このstderrリダイレクトを削除してみましたが、それも機能しませんでした。
私の目標は、スクリプトのすべての出力をsyslogにリダイレクトすることです。したがって、存在しないディレクトリ/許可が拒否されたディレクトリなどでCDを作成しようとした場合も同様です。なぜそれが機能しないのですか、そしてこれを機能させる方法は?
通常のエコーはsyslogに出力されるため、機能します。
echo Test | /usr/bin/logger -t Test
パイプは、プロデューサー(左側)プロセスとコンシューマー(右側)プロセスを並行して実行します。並行して2つのプロセスがあるため、そのうちの少なくとも1つは、メインのシェルプロセスの子プロセスである必要があり、場合によっては両方である必要があります。
ほとんどのシェルは、サブプロセスでパイプの両側を実行します。 ATT kshとzshは、元のプロセスで右側を実行します。
cd
コマンドは、現在のシェルプロセスの現在のディレクトリを変更するため、 組み込みである必要があります 。パイプの左側はサブシェル(スクリプトを実行するシェルプロセスから forked であるサブプロセス)で実行されるため、cd
コマンドはサブシェルでのみ有効になります。動作しますが、サブシェルは直後に終了するため、何の役にも立ちません。あなたはそれを観察することができます
{ cd /tmp; echo -n "left-hand side: "; pwd; } |
{ cd /usr; echo -n "right-hand side: "; pwd; }
echo -n "parent: "; pwd
スクリプトからの出力をログに記録するには、スクリプト全体に適用される単一のパイプラインを作成します。
main () {
… # whole script goes here
}
main | logger