Bashシェルからストリームリダイレクト - 残りのシェルコマンドラインで無条件に設定する方法

Bashシェルからストリームリダイレクト - 残りのシェルコマンドラインで無条件に設定する方法

aptBashシェルで単独で実行され、出力がファイルにリダイレクトされたときに出力が異なることを確認しました。

たとえば、

$ apt install ./*.deb --simulate 1>111.txt 2>222.txt

ストリーム2のファイルにリダイレクト結果テキストを追加し、WARNING: apt does not have a stable CLI interface. Use with caution in scripts.リダイレクトなしでaptを実行すると、このテキストはシェルウィンドウに表示されません。

出力がリダイレクトに依存するのはなぜですか?aptパラメータとしてリダイレクトを検討してください。シェルのコマンドラインの他の部分が目立たないようにリダイレクトを作成するにはどうすればよいですか?

PS Ubuntu 18で見たところ、特定のアプリケーションに関する問題でしたが、問題はUnixで一般的かもしれないので、ただタグにapt入れました。shell

ベストアンサー1

apt歴史的に対話型コマンドラインの使用を念頭に置いて設計されたエンコード警告は、シェルではaptなくシェル内で意図的に実行されます。

ただし、aptコマンドラインを解析する必要はありません。シェルが呼び出されると、すでにこれを行いますapt。これは、ストリームが変更/リダイレクトされたかどうかを検出するaptことです。stdout

スクリプトで使用している場合は、ほぼ同じことを行い、リダイレクトについて警告しないapt同様の古いコマンドがあります。apt-getstdout

TLDRエラーメッセージを書くのはシェルではなくコマンドstderrです。apt

シェルから出力をキャプチャできるという事実は、apt stderrマルチタスクオペレーティングシステムであるUnixの製品であり、その出力を生成することがシェルではありません。

PS。コマンドに対して strace を実行すると、aptメッセージが記録されていることがわかります。

strace apt get install bash > a
....
write(2, "\n", 1
)                       = 1
write(2, "WARNING: ", 9WARNING: )                = 9
write(2, "apt", 3apt)                      = 3
write(2, " ", 1 )                        = 1
write(2, "does not have a stable CLI inter"..., 38does not have a stable CLI interface. ) = 38
write(2, "Use with caution in scripts.", 28Use with caution in scripts.) = 28
write(2, "\n", 1
)                       = 1
write(2, "\n", 1
)                       = 1

おすすめ記事