Shell
為什麼循環輸出的重定向取決於文件 名?
我有兩個文件:
a.csv
和b.csv
:echo $'a_header\na1' > a.csv echo $'b_header\nb1' > b.csv
現在我想從每個中刪除第一行,並將它們連接起來。
for file in `ls *.csv`; do cat $file | tail -n +2 | cat; done
但是,當我將上一個命令的輸出重定向到文件時,我會根據輸出文件的名稱得到不同的結果。
for file in `ls *.csv`; do cat $file | tail -n +2 | cat; done > result for file in `ls *.csv`; do cat $file | tail -n +2 | cat; done > result.csv
cat result a1 b1
cat result.csv a1 b1 b1
如果您有以下命令:
command > file
該命令的標準輸出 (fd 1)
command
被重定向到文件file
. 如果文件不存在,則創建它。命令通常將其命令輸出重定向到文件描述符 1 (stdout)。使用上述表達式時(輸出重定向到文件),文件必須在輸出流開始之前存在。因此
bash
創建文件(空)並連接到 stdoutcommand
,然後開始在該文件描述符上寫入。這是由外殼處理的。該命令不知道它是寫入匿名管道還是文件。
給定這個命令:
for file in `ls *.csv`; do cat $file | tail -n +2 | cat; done > result.csv
這裡發生的事情是文件
result.csv
被創建為空。然後for
循環在每個結尾為csv
(包括result.csv
)的文件中執行。文件被處理a.csv
,然後b.csv
至少result.csv
。result.csv
在 then的第二行b1
。這就是結果文件中有 2 行的原因。