SCREEN で CAT を実行してもファイルに出力されません

SCREEN で CAT を実行してもファイルに出力されません

cat私はこのコマンドを、ファイルを読み取ってそれをフィルタリング用にパイプする他の 2 つのコマンドとともに画面で実行するようにコーディングしようとしていますawk。コマンドは次のとおりです。

screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt | awk '{print $1}' > /var/www/html/filter/first.txt

デタッチされた screen を確認すると、リストがフィルタリングされているのがわかります。フィルタリングが完了すると、ファイルは作成されますが空です。出力ログに screen をfirst.txt使用することについて何かを見たことがありますが、出力はフィルタリングされていないリストがある同じフォルダーに出力し、 と呼びます。正常に実行されるのに、出力ファイルが毎回空になる理由がわかりません。これなしで実行すると、作成されたファイルは空ではありません。screen コマンドで何かが欠けていると思います。screen を使い始めたばかりです。他にいつ投稿すればよいかわかりません。-Lfirst.txtscreen -d -m

答え1

これが機能しない理由は、シェルがコマンドを次のように 2 つの部分に分割するためです。

screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt

awk '{print $1}' >/var/www/html/filter/first.txt

は別のptyでscreen実行されます。出力はありません。cat標準出力にパイプしますawk

パイプを screen の下で実行したい場合は、それをシェルの別のインスタンスとグループ化する必要があります。

screen -d -m bash -c 'cat /var/www/html/filter/unfiltered.txt | awk "{print $1}" >/var/www/html/filter/first.txt'

これを実行すると、これは不必要な使用でありcat、実際にはコマンドは次のように簡略化できることが明らかになります。

screen -d -m bash -c 'awk "{print $1}" </var/www/html/filter/unfiltered.txt >/var/www/html/filter/first.txt'

内部の引用符を一重引用符から二重引用符に変更したことに注意してください。これは、コマンド全体を保護するために (特に$1早期評価から) 一重引用符を使用したためです。

関連情報