web-dev-qa-db-ja.com

ロガーにリダイレクトされたCDが機能しない

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
robert

パイプは、プロデューサー(左側)プロセスとコンシューマー(右側)プロセスを並行して実行します。並行して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