たとえば、以下は私が使用するコマンドです。
tr -d '\n' < newfile.ppm
結果を同じファイルに出力したいので、今やっている作業は次のようになります。
tr -d '\n' < newfile.ppm > newfile.ppm
これがうまくいかないのはなぜですか、それをどのように機能させるのですか?
答え1
これは非常に一般的な「トラップ」です。
ファイルへの書き込みのために stdout または stderr をリダイレクトする場合、シェルは書き込みの準備のために最初にファイルを切り捨てます。すると、次のようなことが起こります。
- シェルはstdinを次に設定します。
newfile.ppm
- シェルは
newfile.ppm
長さ0に切り捨てられます。 - シェルはstdoutを次に設定します。
newfile.ppm
- シェルが実行されます
tr -d '\n'
。ご覧のとおり、現在の時点では の内容がnewfile.ppm
消えて読む内容がありません。
この問題を解決するには、別のファイルに出力するだけです。後で名前を変更できます。
答え2
その後、目的のタスクが実行されます。
[stephan@stephan] ~
$ echo "meh
" > file
[stephan@stephan] ~
$ cat file | tr -d '\n' > file ; cat file
meh