我在命令行中使用zsh,但是我編寫的shell腳本運行bash以便它們可以移植。zsh和bash之間的I/O重定向區別
我瞭解IO重定向從here當我意識到這種差異:
注意,命令只是一個任意的輸出的第一行是在標準錯誤,第二行過來標準輸出。
zsh
在OS X:
% ls -ld /tmp /tnt 1>&2 2>&1 | sed -e 's/^/++/'
ls: /tnt: No such file or directory
++ls: /tnt: No such file or directory
[email protected] 1 root wheel 11 Oct 19 2012 /tmp -> private/tmp
[email protected] 1 root wheel 11 Oct 19 2012 /tmp -> private/tmp
bash
:
bash-3.2$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e 's/^/++/'
ls: /tnt: No such file or directory
[email protected] 1 root wheel 11 Oct 19 2012 /tmp -> private/tmp
我有一個很難搞清楚zsh
的輸出。
此外,在Linux的輸出順序對zsh
稍有不同:
% ls -ld /tmp /tnt 1>&2 2>&1 | sed -e 's/^/++/'
ls: cannot access /tnt: No such file or directory
drwxrwxrwt. 13 root root 4096 Dec 19 23:11 /tmp
++ls: cannot access /tnt: No such file or directory
++drwxrwxrwt. 13 root root 4096 Dec 19 23:11 /tmp
bash
輸出是相同的,但。
更多的實驗中zsh
:
% ls -ld /tmp /tnt 1>&2 | sed -e 's/^/++/'
ls: /tnt: No such file or directory
[email protected] 1 root wheel 11 Oct 19 2012 /tmp -> private/tmp
[email protected] 1 root wheel 11 Oct 19 2012 /tmp -> private/tmp
% ls -ld /tmp /tnt 2>&1 | sed -e 's/^/++/'
++ls: /tnt: No such file or directory
[email protected] 1 root wheel 11 Oct 19 2012 /tmp -> private/tmp
這最後一個有產生相同的結果,以bash
。
我想我應該更喜歡學習bash
的行爲,然後再深入研究zsh
的滴答問題,但這不是很理想,因爲機會至少有一半是我希望做的IO重定向,我當然會想要從zsh
提示中嘗試。我實際上很投資於zsh
,因爲我有大量的自定義插件,在這一點上做一個重大的努力來做一個大轉換回bash。
我不明白你爲什麼這樣做重定向輸出的兩個級別,只是用'2>&1',它應該是在兩個相同的...或者,是否有使用'1&2'的理由? –
這只是爲了探索他們爲什麼表現不同。是的,這是一個玩具的例子。我並不是在問這個問題本身「完成某件事情」,而是要求它獲得更好的理解,以便我能夠理解和解釋這是如何工作的,以便我可以在以後使用知識的力量完成許多事情。 –
並回答你的問題具體...'1>&2'應該送標準輸出到標準錯誤(這是終端),但zsh中似乎仍然可以發送一個副本到管爲好。 –