web-dev-qa-db-ja.com

Cygwinを使用するWindowsでダブルクリックで.shファイルを実行する

Windowsマシンで.shスクリプトファイルを作成しました。ダブルクリックで実行したいのですが。 Cygwinターミナルを開いて、「sh」コマンドで手動で起動すると、問題なく実行されます。

末尾の.shファイルをc:\ cygwin\bin\sh.exeに関連付けて、script.shをダブルクリックすると、ターミナルが1秒間ポップアップし、効果がなくなります。問題は、sh.exeを次のように起動する必要があることだと思います。

C:\cygwin64\bin\sh.exe --login –i

しかし、そのような.shファイルを実行するようにWindowsに指示するにはどうすればよいですか?

9
Rotareti

関連付けを機能させるには、たとえば次のように%1パラメータを追加する必要があります(空白が埋め込まれたパスを操作するには引用符が必要です)。

C:\cygwin64\bin\sh.exe -li  "%1"

質問は以前にいくつかの場所で尋ねられました。これらは役立つかもしれません:

ただし、スクリプトが完了すると、ウィンドウは閉じます。たとえば、readコマンドを使用してスクリプトでその準備を行わない限り(関連付けはスクリプトを引数として渡すだけなので)。その側面についてのいくつかの議論はここにあります:

7
Thomas Dickey

ここやインターネット上の他の場所で見つかった他の回答に不満だったので、これを適切に行う方法を考え出すのにかなりの時間を費やしてきました。これが私が思いついたものです。

  1. _.sh_という名前のキーを作成し、その_(Default)_値を_Shell Script_の下の_HKEY_CLASSES_ROOT_に設定します。
    • _Shell Script_の下に_HKEY_CLASSES_ROOT_という名前のキーを作成し、_(Default)_値を_Shell Script_に設定します。
  2. _HKEY_CLASSES_ROOT\Shell Script_の下にShellという名前のキーを作成します。
  3. _HKEY_CLASSES_ROOT\Shell Script\Shell_の下にopenというキーを作成し、_(Default)_値を_Run with Cygwin_に設定します。
  4. _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ファイルをダブルクリックするだけで、期待どおりに実行されます。

ボーナス:

  1. _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\""
_
6
Drew Chapin

以下をバッチファイルに入れ、「。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")"""
3

私はここと他の投稿やソースからこれに対するかなり完全なソリューションをコンパイルしました。

.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ファイルには問題はありません。

  • 右クリック->管理者として実行できます。

  • 完了したらウィンドウを閉じます。

唯一の制限は、スペースがある場合にパラメーターが正しく渡されず、ファイルをドラッグアンドドロップしてパラメーターとしてパスを渡しても機能しないことです。

2
Gerardo Marset

結局、これが私の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 (マティアスのコメント)

1
Rotareti