2015-05-09 68 views
1

我遇到了this,爲了調試zsh行編輯器小部件,我複製了它,並且我意識到我實際上並不知道2>>|實際上的功能。大概是將stderr送入一個文件,但|的處理是什麼?Zsh重定向2 >> |

回答

2
>>|

是如何zsh選擇從POSIX標準偏離另一個例子:

。注意,在該2>>2附帶到這裏所討論的構建體;他們可以使用默認輸出流stdout(其文件描述符爲1)或任何明確指定的文件描述符(如在此情況下爲stderr的2)。

>>|工作有點類似於POSIX的>|構建,但僅在zsh支持 - 其他主要POSIX兼容的貝殼 - bashdashkshzsh支持它

POSIX >|意味着更換一個現有文件即使noclobber外殼選項生效,其根本目的的防止這樣的替換(「重挫」)時,只使用>

請注意,noclobber默認爲關閉,全部上述殼。

POSIX不提到類似的>>|結構和bashdashksh確實做支持它
理由是:由於>>不會替換,而是附加到現有文件,因此其操作不受noclobber是否生效影響。
在這些貝殼,>>總是允許 - 輸出文件是否已經存在與否,noclobber是否設置或沒有(和,如前所述,>>|在所有不支持)。

zsh懇求不同,並且>> IS受是否noclobber是有效或不: 在一個(可以說邏輯)逆轉>/>|邏輯的與效果noclobber>>僅在目標文件(已經)存在時纔有效

因此,zsh支持>>|(或>>!)至點播創建目標文件的,即使在作用noclobber


有幾種方式來設置/取消該noclobber選項zsh

  • POSIX兼容的方式:

    • zsh -C -c '...' - 通過命令打開在線選項-C,當開始zsh
      • set -C - 與打開設置內置
    • set -o noclobber - 按名稱

如前所述打開,noclobber爲OFF默認,但您可以通過簡單地替換-C機智明確地關閉它h +Cset -oset +o

  • zsh特異性方式:

    • setopt noclobber - 等效的set -o noclobber
      • options[noclobber]=on - 同上
    • setopt clobber - 的等效
      • options[clobber]=on - 同上
+1

所以就像我違反規則製作更多帳戶以支持真正令人敬畏的答案一樣,對吧? –

+0

@StevenLu :)我讚賞這種稱讚。 – mklement0

1

啊,谷歌給了我答案。

從zsh的重定向文件,

> > |字

> >! word

與>>相同,只是該文件在不存在的情況下創建,即使CLOBBER未設置。

這基本上只是向文件提供stderr,創建它。所以我今天也瞭解了CLOBBER,這實際上是標準>>的更「正常」形式。即,由於CLOBBER未被設置,>>可能會出錯。

+0

有趣。我想知道CLOBBER是如何打開和關閉的。 –

+0

也許'setopt'或者什麼 –

+0

@StevenLu,@TrevorHickey:是的,'setopt noclobber'和'setopt clobber'工作,但還有其他方法;看到我的答案。 – mklement0