2017-09-18 46 views
4

忽略重定向後的任何參數還是會產生意想不到的後果?重定向後的參數能做什麼嗎?

我很驚訝地發現,我在我的bash腳本中犯的一個錯字完全沒有區別,因爲它是在重定向之後指定的。例如。我預計它會抱怨這樣的事情

./foo.sh > foo2.log whoops I made a typo 

但它不會引發任何錯誤。我要補充一個分號真正得到它作爲一個命令和錯誤運行,像

./foo.sh > foo2.log; whoops I made a typo 

讓我感到震驚甚至更多,被認爲Linux沒有重定向後 例如放棄

./foo.sh > foo2.log whoops I made a typo > command_is_still_going.log 

絕對是罰款和command_is_still_going.log仍會創建

是「哎呦我做了一個錯字」完全忽略說法呢,還是導致一些不必要的行爲?因爲我傾向於使用這個很多。

+0

潛入[bash文檔](https://www.gnu.org/software/bash/manual/html_node/)。做你的建議是不好的味道,所以人們從來沒有在實踐中這樣做 –

+0

這似乎是一個容易回答的問題。如果運行'echo one> log two three',那麼'log'文件的結果內容是什麼?這些額外的論據是否被忽視? – larsks

+0

謝謝@larsks在我發佈後意識到。所以看起來答案是肯定的,如果你的bash腳本引用輸入參數,這很可能會導致意想不到的事情發生。 –

回答

6

重定向被解析並處理,然後從命令行中刪除。然後執行其餘的命令行。換句話說,重定向可以出現在命令行的任何地方。作爲一種風格點,你應該把它們放在最後。

這些相當於:

./foo.sh > foo2.log whoops I made a typo 
./foo.sh whoops I made a typo > foo2.log 

如果foo.sh忽略它的參數,然後「哎呦我做了一個錯字」沒有效果。

同樣,這些都是一樣的:

./foo.sh > foo2.log whoops I made a typo > command_is_still_going.log 
./foo.sh whoops I made a typo > foo2.log > command_is_still_going.log 

這是兩個獨立的命令:

./foo.sh > foo2.log; whoops I made a typo 

./foo.sh > foo2.log 
whoops I made a typo 
+4

爲了完整起見,請注意重定向也可以出現在一個簡單的命令('> foo2.log ./foo.sh哎呦,我犯了一個錯字')之前,但不是在複合命令之前('> foo2.log for x in 1 2 3; do echo「$ x」; done'無效。) – chepner

0

OK,我想我有我的答案。直接在Linux中,你可以做這樣的事情 echo 'whoops' > foo.log I made a typo ,這將輸出到屏幕「哎呦我做了一個錯字」

所以基本上重定向只是被剝離出來的線的處理,所以不希望的結果會在將重定向作爲參數處理到bash腳本之後是任何東西。

通過使foo.sh只是echo $1而證明了這一點。然後運行它作爲 ./foo.sh > foo.log whatever日誌「無論」作爲第一個參數

1

你可以運行:

> set -x 
> ./foo.sh > foo2.log whoops I made a typo 

,你可以看到什麼實際運行:

> + ./foo.sh whoops I made a typo 

如上所示,額外的文本作爲參數傳遞給foo.sh.