`set -o noclobber` は `echo Hello>>file.txt` を使ったファイルの生成を防ぎます。

`set -o noclobber` は `echo Hello>>file.txt` を使ったファイルの生成を防ぎます。

使った

set -o noclobber

長年かけて.bashrcまたは最近では.zshrc

しかし、たとえば、GitHubの新しいリポジトリの説明では、次の行が見つかりました。

echo SomeName >> README.md

.zshrcこの行があると失敗しますset -o noclobber。それは言うでしょう:

zsh: no such file or directory: README.md

確認するために、私を新しいzshに.zshrc移動して起動し、ファイルがないときにその行が機能しました。ただし、新しいzshを起動して入力して実行すると、存在しないと表示されます。.zshrc_not_usedecho SomeName >> README.mdREADME.mdset -o noclobberecho SomeName >> README_ANOTHER_ONE.mdREADME_ANOTHER_ONE.md

(背景情報は>>「append to」です。ファイルがない場合は新しく作成します。)

どうなりますか?もちろん、set -o noclobber誤ってファイルを削除したくないので、使用したいのですが、シェルに何かを消さないでnoclobberくださいecho SomeName >> README.mdzsh: no such file or directory: README.md

実際、数年前にBashでこれが起こったことを覚えていますが、今はそれを再現することはできません。何が起こっているのか、それに対する良い解決策を知っている人はいますか? (問題を解決するには、touch README.mdbeforeを手動で入力しないでくださいecho SomeName >> README.md。「何が起こったのかわからず、修正してください」になるからです。)

ベストアンサー1

これは録音されたzshの従来の動作(cshから継承されますnoclobber)でksh / POSIX動作を取得するappendcreateことに加えて、noclobber次の設定を行う必要があります(zsh 5.1以降を想定)。

APPEND_CREATE <K> <S>

このオプションはNO_CLOBBER-C)が有効な場合にのみ適用されます。

>>このオプションを設定しないと、まだ存在しないファイルに追加のリダイレクト()を使用すると、シェルはエラーを報告します(既存の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

おすすめ記事