(続):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
という, 認識なのですが間違っている?