Windowsマシンで.shスクリプトファイルを作成しました。ダブルクリックで実行したいのですが。 Cygwinターミナルを開いて、「sh」コマンドで手動で起動すると、問題なく実行されます。
末尾の.shファイルをc:\ cygwin\bin\sh.exeに関連付けて、script.shをダブルクリックすると、ターミナルが1秒間ポップアップし、効果がなくなります。問題は、sh.exeを次のように起動する必要があることだと思います。
C:\cygwin64\bin\sh.exe --login –i
しかし、そのような.shファイルを実行するようにWindowsに指示するにはどうすればよいですか?
関連付けを機能させるには、たとえば次のように%1
パラメータを追加する必要があります(空白が埋め込まれたパスを操作するには引用符が必要です)。
C:\cygwin64\bin\sh.exe -li "%1"
質問は以前にいくつかの場所で尋ねられました。これらは役立つかもしれません:
ただし、スクリプトが完了すると、ウィンドウは閉じます。たとえば、read
コマンドを使用してスクリプトでその準備を行わない限り(関連付けはスクリプトを引数として渡すだけなので)。その側面についてのいくつかの議論はここにあります:
ここやインターネット上の他の場所で見つかった他の回答に不満だったので、これを適切に行う方法を考え出すのにかなりの時間を費やしてきました。これが私が思いついたものです。
.sh
_という名前のキーを作成し、その_(Default)
_値を_Shell Script
_の下の_HKEY_CLASSES_ROOT
_に設定します。Shell Script
_の下に_HKEY_CLASSES_ROOT
_という名前のキーを作成し、_(Default)
_値を_Shell Script
_に設定します。HKEY_CLASSES_ROOT\Shell Script
_の下にShell
という名前のキーを作成します。HKEY_CLASSES_ROOT\Shell Script\Shell
_の下にopen
というキーを作成し、_(Default)
_値を_Run with Cygwin
_に設定します。HKEY_CLASSES_ROOT\Shell Script\Shell\open
_の下にcommand
という名前のキーを作成し、_(Default)
_の値を"C:\cygwin64\bin\mintty.exe" -i /Cygwin-Terminal.ico C:\cygwin64\bin\bash.exe -l -c "cd $(dirname \"$(cygpath -u \"%1\")\") ; $(cygpath -u \"%1\") ; exec bash"
に設定します(もしそうであれば_C:\cygwin64\
_を_C:\cygwin\
_に変更します) 32ビットバージョンを使用)。これで、.shファイルをダブルクリックするだけで、期待どおりに実行されます。
ボーナス:
HKEY_CLASSES_ROOT\Shell Script
_の下にDefaultIcon
というキーを作成し、_(Default)
_値を_%SystemRoot%\System32\imageres.dll,-68
_に設定します。これにより、標準のバッチファイルアイコンがシェルスクリプトに適用されます。レジストリパッチファイルも作成しました(_Run With Cygwin.reg
_として保存)。
_Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.sh]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-68"
[HKEY_CLASSES_ROOT\Shell Script\Shell]
[HKEY_CLASSES_ROOT\Shell Script\Shell\open]
@="Run with Cygwin"
[HKEY_CLASSES_ROOT\Shell Script\Shell\open\command]
@="\"C:\\cygwin64\\bin\\mintty.exe\" -i /Cygwin-Terminal.ico C:\\cygwin64\\bin\\bash.exe -l -c \"cd $(dirname \\\"$(cygpath -u \\\"%1\\\")\\\") ; $(cygpath -u \\\"%1\\\") ; exec bash\""
_
以下をバッチファイルに入れ、「。sh」ファイルの「Opens with」で選択します。
@echo off
C:\cygwin\bin\bash.exe -lc "cd ""%cd%""; ""$(cygpath -u "%1")"""
'cd ""%cd% "";'一部では、Bashプロファイルがホームディレクトリで起動しようとした場合でも、シェルスクリプトが常にそれが呼び出されたのと同じディレクトリで起動するようにします。バックスラッシュをエスケープし、パス名にスペースを含めるには、二重引用符の複数の層が必要です。
ログイン(-l)オプションの代わりに、非組み込みコマンドを確実に使用できるようにするには、パスにbinディレクトリを追加します。
@echo off
set path=%path%;C:\cygwin\bin
bash -c """$(cygpath -u "%1")"""
私はここと他の投稿やソースからこれに対するかなり完全なソリューションをコンパイルしました。
.regとして保存し、ダブルクリックしてレジストリに追加します。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.sh]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script]
@="Shell Script"
[HKEY_CLASSES_ROOT\Shell Script\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-68"
[HKEY_CLASSES_ROOT\Shell Script\Shell]
[HKEY_CLASSES_ROOT\Shell Script\Shell\open]
[HKEY_CLASSES_ROOT\Shell Script\Shell\open\command]
@="\"C:\\cygwin64\\bin\\mintty.exe\" -i /Cygwin-Terminal.ico -t \"%1\" /bin/bash -lc \"cd \\\"$(dirname \\\"$(cygpath -u \\\"%1\\\")\\\")\\\" ; \\\"$(cygpath -u \\\"%1\\\")\\\" %*\""
[HKEY_CLASSES_ROOT\Shell Script\Shell\runas]
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\Shell Script\Shell\runas\command]
@="\"C:\\cygwin64\\bin\\mintty.exe\" -i /Cygwin-Terminal.ico -t \"%1\" /bin/bash -lc \"cd \\\"$(dirname \\\"$(cygpath -u \\\"%1\\\")\\\")\\\" ; \\\"$(cygpath -u \\\"%1\\\")\\\" %*\""
これはC:\cygwin64\bin\mintty.exe
と/bin/bash
を使用し、必要に応じて両方のキーのパスを変更します。
このソリューション:
実行ファイル.sh
をダブルクリックするだけで動作します。
.sh
ファイルがあるディレクトリから実行します。
.sh
ファイル内のPATH
で通常コマンドを実行できるようにします。
スペースを含むパスの.sh
ファイルには問題はありません。
右クリック->管理者として実行できます。
完了したらウィンドウを閉じます。
唯一の制限は、スペースがある場合にパラメーターが正しく渡されず、ファイルをドラッグアンドドロップしてパラメーターとしてパスを渡しても機能しないことです。
結局、これが私のWindows 7マシンでの最良のソリューションであることがわかりました。
1. "Control Panel" > "Default Programs" > "Set Associations"
に移動し、.sh
ファイルをc:\cygwin\bash.exe
で終わるファイルに関連付けます。
2 .regedit
を開いてHKEY_CLASSES_ROOT\Applications\bash.exe\Shell\open\command
に移動し、"C:\cygwin\bin\bash.exe" -li "%1"
に変更します。
ここにあります https://stackoverflow.com/a/106325/1612318 (マティアスのコメント)