入力をファイル自体として使用するコマンドの出力をファイルに保存できないのはなぜですか? [コピー]

入力をファイル自体として使用するコマンドの出力をファイルに保存できないのはなぜですか? [コピー]

たとえば、以下は私が使用するコマンドです。

tr -d '\n' < newfile.ppm 

結果を同じファイルに出力したいので、今やっている作業は次のようになります。

tr -d '\n' < newfile.ppm > newfile.ppm

これがうまくいかないのはなぜですか、それをどのように機能させるのですか?

答え1

これは非常に一般的な「トラップ」です。

ファイルへの書き込みのために stdout または stderr をリダイレクトする場合、シェルは書き込みの準備のために最初にファイルを切り捨てます。すると、次のようなことが起こります。

  1. シェルはstdinを次に設定します。newfile.ppm
  2. シェルはnewfile.ppm長さ0に切り捨てられます。
  3. シェルはstdoutを次に設定します。newfile.ppm
  4. シェルが実行されますtr -d '\n'。ご覧のとおり、現在の時点では の内容がnewfile.ppm消えて読む内容がありません。

この問題を解決するには、別のファイルに出力するだけです。後で名前を変更できます。

答え2

その後、目的のタスクが実行されます。

[stephan@stephan] ~ 
$ echo "meh                                    
" > file
[stephan@stephan] ~ 
$ cat file | tr -d '\n' > file ; cat file 
meh

関連情報