Linuxでは、次のCDが正しく動作するため、cdをtmpに変換します。
/ # cd /tmp
tmp #
しかし、これはうまくいきません(ルートにとどまり、/ var / log / messagesには何も表示されません)。なぜできないの?
/ # cd /tmp 2>&1 | /usr/bin/logger -t Test
/ #
このstderrリダイレクトを削除しようとしましたが、それも機能しませんでした。
私の目標は、スクリプトのすべての出力をsyslogにリダイレクトすることです。存在しない/権限が拒否された/などのディレクトリでCDを試みる場合も同様です。なぜそれがうまくいかず、それをうまく作るのですか?
通常のエコーはシステムログに印刷されるので機能します。
echo Test | /usr/bin/logger -t Test
ベストアンサー1
パイプラインは、生産者(左)プロセスと消費者(右)プロセスを並列に実行します。 2つの並列プロセスがあるため、そのうちの少なくとも1つは基本シェルプロセスの子プロセスでなければならず、両方とも可能でなければなりません。
ほとんどのシェルは子プロセスでパイプの両側を実行します。 ATT ksh と zsh は元のプロセスの右側で実行されます。
このcd
コマンドは現在のシェルプロセスの現在のディレクトリを変更するため、組み込む必要があります。パイプの左側はサブシェルで実行されます(サブプロセスは二股に分かれたスクリプトを実行するシェルプロセスから起動すると、この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