Shell

為什麼循環輸出的重定向取決於文件 名?

  • September 29, 2015

我有兩個文件:a.csvb.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創建文件(空)並連接到 stdout command,然後開始在該文件描述符上寫入。

這是由外殼處理的。該命令不知道它是寫入匿名管道還是文件。


給定這個命令:

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.csvresult.csv在 then的第二行b1。這就是結果文件中有 2 行的原因。

引用自:https://unix.stackexchange.com/questions/232699