hack のためのネタ帳, etc,,,

症状

多分この数週間じゃないかと思うのだが、"Cygwin mintty here" で、空白を含むパスへの移動が出来なくなってしまったようだ。
原因を調べてみると、どうもコマンドラインパラメータのパース処理に変更があったのではないかと思われるような挙動が確認された。
/bin/xhere の第2パラメータに設定されるパラメータが「'%L'」が「C:\Users\kou\Desktop\新しいフォルダー (6)」ではなく「'C:\Users\kou\Desktop\新しいフォルダー (6)'」のようにクオーテーションで囲まれた値になってしまっている。これはダブルクオーテーションにしても同様なようだ。
mintty を、バージョンアップしてない古い cygwin32 に変えて、bash は cygwin64 の物を使ってみると、/bin/xhere ではクオートなしの値がちゃんと得られるのだが、cmd や BAT ファイルから cygwin64 プロセスを呼び出す際にクオーテーションで囲ったパラメータを与えても同様の症状が発生している。しかし cygwin64 プロセス上から呼び出す際には、クオーテーションの囲みは解除された状態で argv に渡っているので、どうも最新版の Cygwin の argv パーサーが、非 cygwin の win32 ネイティブプロセスからパラメータを受け取る際の動作に何らかの変更があったのではないかと思われる。

現状の Cygwin の argv パースルーチンがどうなっているのかは要検証。

とりあえず /bin/xhere は単なる bash script で、使い方は
xhere shell workdir
となっているので、アドホックな対処法しては /bin/xhere の先頭で以下のように、
第2パラメータがクオートまたはダブルクオートで囲まれている場合に、デクオートするようにしてやれば問題はほぼ回避出来る。
if [[ ! -e "$2" && "${2::1}" = "${2: -1}" && ( "${2::1}" = "'" || "${2::1}" = '"' ) ]]; then
  tmp=( "$@" )
  tmp[1]="${2:1:-1}"
  set -- "${tmp[@]}"
fi
以下に patch を用意した。

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます