(続):Vitalize を複数回実行するとカレントディレクトリに空ファイルができる.

:Vitalize を複数回実行すると空ファイルができる - vim 初心者の作業メモ の続き.

syngan
csh 環境だとでるみたいですね。System.File が b-sh 固定な実装になっています。
let ret = system("/bin/rm" . option . ' ' . shellescape(a:path) . ' 2>&1')
あれ、うそっぽい><
でも、printf debug 結果では rmdir があやしいです。
http://lingr.com/room/vim/archives/2012/11/09#message-12873408
mattn
csh も 2>&1 ありますよ
shell* なんとか系のオプションが影響していると見た
shellredirってどんな値ですか?
system("/bin/rm -f -r '/path/to/dir' 2>&1") が
/bin/csh -c "/bin/rm -f -r '/path/to/dir' 2>&1" 2>&1 になって、
1が出来るとみた
手元でやったら 1 できた
そもそも -f 指定してるのでエラーは返らないし、2>&1 を付けなくてもいいと思う
http://lingr.com/room/vim/archives/2012/11/09#message-12874432

bsh 環境でも空ファイル "1" ができると言ったけど間違いだった.
bash 上から vim を起動しても shell が tcsh を指していたので, system の結果は同じだった.

csh% cat shelltest.vim 
:echo &shell
:echo &shellredir
:quit
csh% vim -S shelltest.vim 
/usr/bin/tcsh
>&
csh% bash
bsh$ vim -S shelltest.vim 
/usr/bin/tcsh
>&

ということで, 以下のようにすれば空ファイルはできなくなった.

:set shell=/bin/bash
:call system("/bin/rm -f -r '/tmp/to/dir' 2>&1")

そもそも, csh も 2>&1 があるのか?

質問投げたけど返ってこないし.
manpage みるかぎりそんな記述は見当たらないし, 2>&1 ができないことがcsh スクリプトを書いてはいけない理由の一つ.

1. ファイル記述子

csh プログラミングにおいて直面する最もありがちな問題は、ファイル記述子
(訳注1)の操作ができないことです。できるのは、標準入力または標準出力を
リダイレクトすること、または標準エラーを標準出力へ複製することだけです。
Bourne 互換シェルを使えば、もっと変化に富んだことが可能です。

(略)

同様に、csh スクリプトではエラーメッセージを適切に標準エラーに出力する
ことができません。Bourne シェルなら、こんなふうに書けるでしょう。

    echo "$0: $file が見つかりません" 1>&2

しかし、csh では標準出力を標準エラーにリダイレクトすることはできません。
だから、結局次のようなばかばかしいものを書くはめになるのです。

    sh -c 'echo "$0: $file が見つかりません" 1>&2'
http://www.kiso.tsukuba.ac.jp/~makimura/text/node239.html

実際に, vim 上での system 結果と同様に csh 上で実行してもファイルはできる.
下記のように "2>&1" は文法エラーにはならず実行可能.
2 はコマンドの引数として解釈され, ファイル 1 にリダイレクトされる.

% echo hoge 2>&1
% cat 1
hoge 2

という, 認識なのですが間違っている?

追記

'f' オプション関係なく消していいと思います. だって標準エラー出力を標準出力にリダイレクトしているだけで, "メッセージを出力しない" 処理にはなっていません.
bsh 系のときでもほとんど意味のないものになっているので. メッセージがでたとしても標準エラー出力にでるべきものがそうならないのはよろしくないと思います.

アクセス権のないディレクトリだとエラーがでるのかな.