最新

cheep, cheep, cheep...


2008-08-25

_ [linux] zsh の MULTIOS

某日記に,

% grep > *.sh

というコマンドを誤って実行してしまい,手元のスクリプトを全部消してしまった話があった.

これは, zsh 固有の機能である出力リダイレクト先を複数作成できる機能の弊害だ. bashやtcshならば以下のような振舞いをし,ファイルが切り詰められることはなかった.

bashの場合

% echo foo > *.sh
bash: *.sh: ambiguous redirect

tcshの場合

% echo foo > *.sh
*: Ambiguous.

複数のファイルに出力したい場合には,素直に (?) tee を使えばよい. setopt NO_MULTIOS を ~/.zshrc に追加し,この機能を無効にすることにした.

以下,機能を無効にする前に行なった実験.

% ls
a  b
% grep '' *
a:a
b:b
% echo foo > *
% ls
a  b
% grep '' *
a:foo
b:foo
% setopt NO_MULTIOS
% echo bar > *
% ls
*  a  b
% grep '' *
*:bar
a:foo
b:foo