多分この数週間じゃないかと思うのだが、"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 で、使い方は
第2パラメータがクオートまたはダブルクオートで囲まれている場合に、デクオートするようにしてやれば問題はほぼ回避出来る。
原因を調べてみると、どうもコマンドラインパラメータのパース処理に変更があったのではないかと思われるような挙動が確認された。
/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 を用意した。
- Gist / kou1okada / xhere.patch
- Cygwin / Source in Git
- GitHub / mirror / newlib-cygwin
タグ
コメントをかく