![[duplicate]コマンドで処理されたソースファイルと同じファイルにリダイレクト](https://linux33.com/image/58870/%5Bduplicate%5D%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E5%87%A6%E7%90%86%E3%81%95%E3%82%8C%E3%81%9F%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E5%90%8C%E3%81%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88.png)
ここではリダイレクトは許可されません。許可されていませんか
cat
?しかし、リダイレクトは実行されるコマンドから独立していませんか?$ cat bk > bk cat: bk: input file is output file
次のリダイレクトによってファイルが消去されるのはなぜですか?
$ less bk > bk
awk
less
また、リダイレクトと同様に動作します。awk
実際に問題を発見した部分がありますが、上記の例は言葉ではありません。
通常、リダイレクトを使用する正しい方法は何ですか?
答え1
問題は、出力リダイレクトがless
開始する前にファイルを終了することです。
open("file", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
execve("/usr/bin/less", ["less", "-WNS", "file"], [/* 102 vars */]) = 0
通常の出力リダイレクトはこのファイルを上書きします。O_TRUNC
(参照)man 2 open
ファイルの内容を削除します。