ファイル1、ファイル2、ファイル3があります。
ファイル 1 には以下が含まれます。1
ファイル 2 には以下が含まれます。2
ファイル 3 には以下が含まれます。3
私はコマンドを使用します
cat file1 > file2 > file3
結果:
ファイル11
file2(何も含まない)
ファイル31
なぜこの路線のどれが破壊されるのですか?基本的に私が後ろから見ることができないものは何ですか?
(「追加」を使用する補助メモ>>
はもはやありません)
答え1
Bourne/POSIX スタイルシェルのリダイレクトバッシュのような、ダッシュ、kshなど
表示される順序で左から右に処理します。
> x
開いているそして切りましたfile、x
標準出力に書き込むためのファイル記述子を設定します。x
あなたの命令:
cat file1 > file2 > file3
する:
- 開いて切る
file2
- このファイル記述子に書き込むように標準出力を設定します。
- 開いて切る
file3
- このファイル記述子に書き込むように標準出力を設定します。
- 走る
cat file1
最終結果は、標準出力がランタイムをfile3
指すことですcat
。file2
どちらもfile3
現在の内容を消去し、file3
(の内容)出力をここに書き込みます。cat
file1
出力を複数のストリームに分割して別々のファイルに書き込む場合は、次のことができます。使用tee
:
cat file1 | tee file2 > file3
その他のシェル(特にzsh
)は動作が異なり、コマンドは予想される結果を提供しますfile2
。file3
file1
ここではこれはcat
不要で、<
入力リダイレクトも操作を実行します。
答え2
fd を複数回リダイレクトすると、すべてのリダイレクトが実行され、最後のリダイレクトが残ります。
$ strace -f -e open bash -c 'cat file1 > file2 > file3'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
[pid 20508] open("file2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 20508] open("file3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
[pid 20508] open("file1", O_RDONLY) = 3
したがってfile2
、開いて切り取ってからfile3
開きます。