20676


環境  
OS：windows7 64bit  
git: 1.9.5.msysgit.1 32bit  
ruby: 2.1.5p273 (2014-11-13 revision 48405) [i386-mingw32]  
※git操作等は全て問題なく動作している状態

本現状を具体的に説明しますと、git for windows に付属している git bash を起動し、  
rubyのスクリプトを実行すると、指定した引数の値がrubyに引き渡った時点で  
書き換わります。  
たとえば、

> $ ruby -e "puts ARGV" "/home/user" "test123"

とすると、以下が表示されます

> C:/Program Files (x86)/Git/home/user  
>  test123

本来なら

> /home/user  
>  test123

となることを想定していました。

ちなみに、git bash 上で "$ ls /" とすると C:/Program Files (x86)/Gitフォルダ内のファイルが表示されます。

> $ ls /  
>  Git Bash.vbs ReleaseNotes.rtf bin cmd doc etc lib libexec share ssl
> unins000.dat unins000.exe

また、引数の先頭を"//"とすると正しく表示されます

> $ ruby -e "puts ARGV" "//home"  
>  /home

しかし、"//home/user" とすると、正しく表示させません

> $ ruby -e "puts ARGV" "//home/user"  
>  //home/user

このことから git bash では "/" が特別な意味を持っていそうですが、書き換わる理由がわかりません。  
そもそも、git bash で ruby を動作させることが問題かもしれませんが、何か解決方法はないでしょうか？


CC BY-SA 3.0
2016-01-06T12:24:50.010
20672
2016-10-06T03:23:56.310
13909
question
ruby git bash
Git for Windowsに付属しているbashコンソールからrubyを実行すると指定した引数が書き換わる


多分ですけど、お使いの git bash は MSYS の bash だと思います。

MSYS の bash は、ヒューリスティックを使って、勝手に引数の posix path を windows の path に変換する様子です。

ソース: <https://www.gnu.org/software/libtool/manual/html_node/Native-MinGW-File-
Name-Conversion.html>

* * *

具体的なケースは違いますけど、 make の引数が勝手に変わってしまうのをどうにかしたいという質問が本家に上がっていました。

<https://stackoverflow.com/questions/7250130/how-to-stop-mingw-and-msys-from-
mangling-path-names-given-at-the-command-line>

そこでの回答は、 MSYS make を使うな、が accepted answer だったので、今回も同様に、 MSYS bash (すなわち、議題の
git bash ) を使うな、が答えになるのではないかと考えています。

具体的には、 cygwin の bash を使え、に集約するのではないか、と考えています。

というのも、 [Using Cygwin effectively with Windows](https://cygwin.com/cygwin-ug-
net/using-effectively.html) にあるように、cygwin の環境下では、 windows 用のバイナリに対しては (もっというと、
cygwin の gcc でビルドされたわけではない windows 上の exe ファイルに対しては)
パスの変換がかからない様子だからです。おそらく、どこでパスの変換を行うかが cygwin と MSYS では設計が違っていて、 cygwin は各実行
exe が必要に応じて、実行時ライブラリ`cygwin1.dll`によってパスを変換するのに対し、 MSYS
ではシェルがそのパス変換の責務を負う設計になっている様子です。


CC BY-SA 3.0
2016-01-06T13:32:48.363
20675
2016-01-06T17:54:09.090
2017-05-23T12:38:56.467
-1
754
20672
answer


MSYS(MinGW)の [Posix Path
Conversion](http://www.mingw.org/wiki/Posix_path_conversion)
によるものです。MSYSのBashが外部プログラムを起動する際に、その引数にあるパス(らしきもの)を一定のルールに従って変換します。そのルールについては
[リンク先](http://www.mingw.org/wiki/Posix_path_conversion)
にありますので、それをうまく利用して望む動作にできるかもしれません。


CC BY-SA 3.0
2016-01-06T13:37:04.103
20676
2016-01-06T13:37:04.103
208
20672
answer


MinGW Gitにある、Git CMDの方、git-cmd.exeをrubyのパス設定して、起動すれば、コマンドプロンプトにて、git,
rubyが使えて、想定されているような返りが得られると思います。

起動のエイリアスのTargetにて、git-cmdをrubyのパスをセットして起動する。

[code]

    "C:\Program Files\Git\git-cmd.exe" C:\Ruby22-x64\bin\ore-setrbvars.bat  
    
[/code]

ore-setrbvars.bat

[code]

    @ECHO OFF
    REM Determine where is RUBY_BIN (where this script is)
    PUSHD %~dp0.
    SET RUBY_BIN=%CD%
    POPD
    
    REM Add GRADLE_BIN to the PATH
    SET GRADLE_BIN=C:\gradle-3.1\bin
    SET PATH=%GRADLE_BIN%;%PATH%
    REM Add RUBY_BIN to the PATH
    REM RUBY_BIN takes higher priority to avoid other tools
    REM conflict with our own (mainly the DevKit)
    SET PATH=%RUBY_BIN%;%PATH%
    SET RUBY_BIN=
    
    REM Display Ruby version
    ruby.exe -v
    
[/code]

使用中のものでgradleのパスも入ってますが、参考になれば幸いです。  
※使用中の環境では、システムのパスにgitもrubyも入っていません。


CC BY-SA 3.0
2016-10-06T03:23:56.310
29381
2016-10-06T03:23:56.310
19042
20672
answer