確定">"後面的檔案是否存在如果存在,將此檔案內容清空如果不存在,新建立一個空檔案將左側的結果輸出到右邊的檔案內其實這也沒有什麼,畢竟本來題主的目的就是把原檔案的內容清空,然後輸入已經排好的內容;但問題是,在題主的這個命令裡面,哪個步驟先進行。繼續摘錄bash manual(Bash Reference Manual)的Redirection部分:Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell.所以這段命令實際的執行順序如下:確定有Redirection Operator “>",於是優先對">"右邊的$FILE檔案進行初始化,在這裡的情況就是對檔案內容進行清空操作(因$FILE應該已經存在了)在$FILE檔案內容清空完畢後,bash建立了一個監察程序;一旦">"左側的指令有任何輸出內容,就將其輸出到右側的$FILE檔案中初始完畢,開始執行command部分指令,也就是cat $FILE | sort | uniq 部分,此時的$FILE由於之前的初始化操作,已經處於空檔案狀態command對已經空掉的$FILE進行sort和uniq操作;因輸入內容為空,輸出內容也為空,寫入“>"右側的$FILE檔案中指令完畢那麼如何避免這個尷尬呢?其實很簡單,不要用">",用tee就成了。也就是把命令寫成:cat $FILE | sort | uniq | tee $FILE以上-----------------------更新的分割線-------------------------------------其他答案有說,不保證是先執行cat還是shell,好吧。。。我只是參考bash manual的說法,我的理解是shell端先執行;而且我專門試了一下,輸出的都是空檔案,無論是bash還是zsh,版本分別是4.3.11和5.0.2;也許其他的shell會出現不同的狀況吧,這我就不瞭解了。。。
前面的sort和uniq基本上沒有問題,雖然我個人建議寫成 cat $FILE | sort | uniq 這樣,當中加空格問題主要是後面這個“>",按照 @劉向提供的材料,可以確定使用這個符號時,會產生以下幾個步驟:
確定">"後面的檔案是否存在如果存在,將此檔案內容清空如果不存在,新建立一個空檔案將左側的結果輸出到右邊的檔案內其實這也沒有什麼,畢竟本來題主的目的就是把原檔案的內容清空,然後輸入已經排好的內容;但問題是,在題主的這個命令裡面,哪個步驟先進行。繼續摘錄bash manual(Bash Reference Manual)的Redirection部分:Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell.所以這段命令實際的執行順序如下:確定有Redirection Operator “>",於是優先對">"右邊的$FILE檔案進行初始化,在這裡的情況就是對檔案內容進行清空操作(因$FILE應該已經存在了)在$FILE檔案內容清空完畢後,bash建立了一個監察程序;一旦">"左側的指令有任何輸出內容,就將其輸出到右側的$FILE檔案中初始完畢,開始執行command部分指令,也就是cat $FILE | sort | uniq 部分,此時的$FILE由於之前的初始化操作,已經處於空檔案狀態command對已經空掉的$FILE進行sort和uniq操作;因輸入內容為空,輸出內容也為空,寫入“>"右側的$FILE檔案中指令完畢那麼如何避免這個尷尬呢?其實很簡單,不要用">",用tee就成了。也就是把命令寫成:cat $FILE | sort | uniq | tee $FILE以上-----------------------更新的分割線-------------------------------------其他答案有說,不保證是先執行cat還是shell,好吧。。。我只是參考bash manual的說法,我的理解是shell端先執行;而且我專門試了一下,輸出的都是空檔案,無論是bash還是zsh,版本分別是4.3.11和5.0.2;也許其他的shell會出現不同的狀況吧,這我就不瞭解了。。。