Bash

set -o noclobber 防止使用 echo Hello >> file.txt 創建文件

  • August 23, 2022

我用過

set -o noclobber

多年來.bashrc或最近,.zshrc

但是,我注意到,例如在 GitHub new repo 指令中,該行

echo SomeName >> README.md

如果我.zshrc有這條線會失敗set -o noclobber。它會說:

zsh: no such file or directory: README.md

為了確認,我將我的移動.zshrc.zshrc_not_used並啟動了一個新的 zsh,然後當文件不存在時,該行將echo SomeName >> README.md起作用。README.md但是現在如果我啟動一個新的 zsh 並輸入set -o noclobberand do echo SomeName >> README_ANOTHER_ONE.md,那麼它會說不README_ANOTHER_ONE.md存在。

(背景資訊是>>“附加到”,並在文件不存在時創建文件。)

這是怎麼回事?當然,我想使用set -o noclobber,因為我不想意外清除任何文件,但是為什麼這與它noclobber有任何關係echo SomeName >> README.md,它說zsh: no such file or directory: README.md. 我告訴外殼不要擦除任何東西,而是在它沒有擦除任何東西時拒絕創建新內容。

我實際上記得幾年前它也發生在 Bash 中,但現在我無法重現它。有人知道發生了什麼以及對此有什麼好的解決方案嗎?(為了解決問題,不要手動輸入touch README.mdbefore echo SomeName >> README.md,因為那將是“在不知道發生了什麼的情況下修復它”)

這被記錄為 zsh 的傳統行為(繼承自 csh wherenoclobber來自),設置appendcreate(假設 zsh 5.1 或更高版本)以及noclobber獲取 ksh / POSIX 行為:

APPEND_CREATE <K> <S>

此選項僅在NO_CLOBBER( -C) 生效時適用。

>>如果未設置此選項,當對不存在的文件使用附加重定向 ( ) 時,shell 將報告錯誤(傳統的 zsh 行為NO_CLOBBER)。如果設置了該選項,則不會報告錯誤(POSIX 行為)。

% set -o noclobber
% echo foo >> bar
zsh: no such file or directory: bar
% set -o appendcreate
% echo foo >> bar
% cat bar
foo

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