web-dev-qa-db-ja.com

どうすれば.shファイルをCygwinに関連付けることができますか?

Windowsで.shファイルをダブルクリックしてCygwinで長いrsyncコマンドを実行したいのですが。相対パスが機能するように、ファイルが含まれているディレクトリ(/ cygdrive/c/scripts /など)から開始する必要があります。誰かがこれを機能させましたか?

注:Windowsのコンテキストメニューを管理するCygwinパッケージ(Bash Prompt Here) here を見つけました。いくつかの手掛かりがあるかもしれません。

48
Jerph

わかりました。うまくいくものを見つけました。 Vladimirが提案したようにバッチファイルを関連付けることは機能しませんでしたが、bash引数が重要でした。

短くて甘い:このコマンドに関連付けます:"C:\ cygwin\bin\bash.exe" -li "%1"%*

方法がわからない場合のロングバージョン:

  1. エクスプローラで、ツール/フォルダオプション/ファイルタイプに移動します。
  2. 私はすでにBash ScriptのSHエントリを持っていました。ない場合は、[新規]をクリックし、「SH」と入力して作成します。
  3. SH拡張が選択された状態で、[詳細]をクリックします。
  4. 「開く」アクションを選択し、[編集]をクリックします(またはアクションを作成します)。
  5. これは使用するコマンドです"C:\ cygwin\bin\bash.exe" -li "%1"%*-liがないと、スクリプトで「コマンドが見つかりません」が再実行されることに注意してください。

[〜#〜] sh [〜#〜][〜#〜] pathext [〜#〜]環境変数に追加することもできます:

WinKey + Pause/Advanced /環境変数/システム変数/ PATHEXT

皆さん、助けてくれてありがとう!

41
Jerph

これが私の解決策です。ディレクトリ階層のどこにあるかに関係なく、私の* .shスクリプトでうまく機能します。 cygpathでbashを呼び出す前に、cygpath dirnameにcdしていることに注意してください。うまくいきます。

assoc .sh=bashscript

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"'
15
user78706

私はしばらくの間Dragosのソリューションを使用しており、シェルスクリプト内で "cygpath -u"を使用する必要がなくなるため、これを最良のソリューションと見なしています。

次に、.shおよび.bashファイルのドラッグ&ドロップサポートなどの追加機能が必要でした。少し掘り下げた後、.shファイルと.bashファイルを「bashscript」として関連付け、それらのWindowsエクスプローラーのドラッグ&ドロップハンドラーをアクティブにする.batを作成しました。 Dragosのコマンドを編集して、1つの引数(シェルスクリプトにドロップされたアイテムへのパス)を処理する必要がありました。

.batファイルは、おおよそ次のようになります。

echo Registering .sh and .bash files as "bashscript"...
assoc .sh=bashscript
assoc .bash=bashscript
echo.
echo Setting the run command for the file type "bashscript"...
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"'
echo.
echo Activating the drag^&drop capability for "bashscript" files (only 1 dropped item
echo will be passed to the script, multiple items are not supported yet)...
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f

Cygwinルートの「argshandler.sh」スクリプトは、最初に受け取った引数をcygpathだけ戻し、何もない場合(スクリプトファイルをダブルクリックする場合など)は何もしません。

#!/bin/bash
if [ ! "$1" == "" ]
then
    cygpath -u "$1"
fi

これまでのところ、これらはすべてうまく機能しています。ただし、解決すべきニースとなるいくつかの欠点がまだあります。

  • Dragosのコマンドとその派生物は、UNCパス上にあるスクリプトに関しては失敗します。 \\ myserver\myshare\scriptfile.sh
  • ドロップされたアイテムは1つだけシェルスクリプトに渡されます。

どういうわけか、1ドロップされたアイテムのみの問題に関して、引数ハンドラースクリプトを変更して次のようなものを返す

"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3"

ドラゴのコマンドのセッターを次のように変更します

...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")'

(argshandler.shパーツの周りの ""がなくなっていることに注意してください)が正しく機能していないようです:スクリプトにドラッグされたアイテムの一部にパスに空白が含まれている場合、パスは空白で複数の引数に分割されますそれらのそれぞれが二重引用符で囲まれていても...奇妙です。

これらの問題の1つまたは両方を解決することに慣れているコマンドラインの専門家はいますか?

6
eomanis

これは私が使用しているコマンドです:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

それはminttyで実行され、最大化され、実行されているスクリプト(ウィンドウへのパス)にウィンドウタイトルを設定し、スクリプトがある場所にディレクトリを変更し、スクリプトを実行し、完了後も開いたままになります。

または、これにより、タイトルがスクリプトのcygwinパスに設定されます。

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%1")\007" && cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"'

関連付けを設定するバッチスクリプト:

タイトル内のWindowsパス:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause

タイトルのcygwinパス:

@echo off
assoc .sh=shellscript
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%%1")\007" ^&^& cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"'
pause
2
user5227562

これは.shファイルを関連付けませんが、必要なものが得られる可能性があります。 Cygwin bashシェルを起動するcygwin.batバッチファイルから始めて、次のように変更しました。

$ cat test.bat
@echo off

set MYDIR=C:\scripts

C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15"

これはおもちゃのスクリプトですが、rsyncを呼び出すか、別のシェルスクリプトを呼び出すように変更することができます。 MYDIRがハードコードされていなかった方がいいでしょう。それを自動的に設定する方法がprobabyにあります。

そうそう、Cygwinのbashシェルで.batファイルを作成したとき、ダブルクリックで起動する前に、「chmod + x test.bat」を実際に実行する必要があることに気付きました。 NTFSアクセス許可を設定していると思います。メモ帳だけを使用している場合は、その必要はありません。

2
David
    Windows Registry Editor Version 5.00
    ;File:ConfigureShToBeRunUnderExplorer.reg v:1.0 docs at the end
    [HKEY_CLASSES_ROOT\Applications\bash.exe] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\Shell]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\Shell\open]

    [HKEY_CLASSES_ROOT\Applications\bash.exe\Shell\open\command]
    @="C:\\cygwin\\bin\\bash.exe -li \"%1\" %*"

    ; This is a simple registry file to automate the execution of sh via cygwin on windows 7, might work on other Windows versions ... not tested 
    ; you could add this setting by issueing the following command: reg import ConfigureShToBeRunUnderExplorer.reg 
    ; Note the path of your bash.exe
    ; Note that you still have to add the .sh to your %PATHTEXT%
            ; usage: double - click the file or reg import file 
1
Yordan Georgiev

別の場所を見回した後。私が思いついたのは、最初にC:\cygwin64\bin\mintty.exe Windowsの[プログラムから開く...]ダイアログから、次のレジストリ値を編集します

[Computer\HKEY_CLASSES_ROOT\Applications\mintty.exe\Shell\open\command]

に、

C:\cygwin64\bin\mintty.exe -t "%1" /bin/bash -l -i -c "v1=\"$(cygpath -u \"%0\" -a)\" && v2=\"$(dirname \"$v1\")\" && cd \"$v2\" ; exec bash  \"%1\" %*"  
1
Light93

.shファイルを\ CYGWIN\usr\bin\bash.exeに関連付けることができるはずです。スクリプトは独自の作業ディレクトリを変更する必要があります。私はこのようなものを上部に貼り付けることをお勧めします。

cd `dirname "$0"`
1
Sparr

私はPuttyCyg(Cygwinウィンドウの素晴らしいPuTTY)を使用しています。

バッチスクリプトを作成します。私のマシンでは

C:\Dev\scripts\cygbashrun.bat

内容付き

SET CYGWIN=nodosfilewarning
C:\Cygwin\bin\PuTTY.exe -cygterm /bin/bash.exe %1

明らかに、PuttyCygのインストールのパスを含むように調整します。

次に、Windowsファイルエクスプローラーで、[ツール]-[フォルダーオプション]-[ファイルの種類]に移動します。

「.sh」エントリがない場合は作成します(または、スクリプトの内容に応じて.bashを作成します)。次に、詳細設定を行います。

[オプションの手順]アイコンを変更し、インストールからCygwinアイコンを選択します

次に:

  1. 新着..
  2. アクション= Bashscriptを実行します。
  3. このアクションの実行に使用されたアプリケーション= C:\ Dev\scripts\cygbashrun.bat "%1"

私にとっては魅力のように機能します:O)

0
HaveAGuess

Dosボックスでassocおよびftypeコマンドを確認します。これが私のマシンの.jpgの例です

c:\>assoc .jpg
.jpg=jpegfile

c:\>ftype jpegfile
jpegfile="C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1"

assoc .sh=bashscript

ftype bashscript="c:\cygwin\bin\bash.exe" "%1"

ftypeコマンドでパスをbashに変更し、cygwinがインストールされている場所と一致するようにしてください。

0
Jim Riblett

機能する1つの解決策は、.bat cygwinを開いてスクリプトを実行するファイル。

スクリプトを実行するスクリプトgo.shホームディレクトリにあります:

@echo off

C:
chdir C:\cygwin\bin

bash --login -i ./go.sh
0
Vladimir

次のように、自分で.batスクリプトを開発し(他の回答に由来するものではなく)、この.batで開くファイルタイプ(* .cygwinなど)を関連付けました。

===ファイルrun-script-with-Cygwin-in-same-dir.bat ===

_@echo off
REM   Info: A script created by Johnny Wong.  (last modified on 2014-7-15)
REM   It is used to pass a file argument to run a bash script file.  The current directory is setting to the path of the script file for convenience.
REM   Could be copied to C:\cygwin;  and then you manually associate .cygwin file extension to open with this .bat file.
set CYGWIN=nodosfilewarning

C:\cygwin\bin\bash --login -i -c 'cd "`dirname "%~1"`"; exec bash "%~1" %2 %3 %4 %5 %6 %7 %8 %9'

REM finally pause the script (press any key to continue) to keep the window to see result
pause
_

===ファイルrun-script-with-Cygwin-in-same-dir.bat ===

使用される構文の詳細な説明(興味がある場合):

  1. この.batで開くファイルに関連付けられている場合、%1は "..."で囲まれます。ファイルをこの.batにドラッグする場合、ファイルのパスにスペースが含まれている場合にのみ「...」が引用されます。
  2. %〜1は%1と同じですが、二重引用符が存在する場合は、取り除かれます
  3. %p%から周囲の二重引用符を削除するには、for %%a in (%p%) do set p=%%~aを使用します
  4. スクリプトファイルのパスを強制的に二重引用符で囲むには_"%~1"_を使用する必要があります。これにより、エスケープ文字として扱われる場合、フォルダー区切り文字「\」(%1内)がbashによって削除されません。それ以外の場合は、パスにスペースがないファイルをこの.batにドラッグしても機能しません。
  5. 「exec bash」は単に「bash」にすることができ、前者はもう1つのbashプロセスのリソースを節約するためのものです。

楽しんでいます:)

0
Johnny Wong

私は気にしませんでした。私は.shファイルをCrimson Editorに関連付けました(実際に実行するのと同じくらい多くの時間をかけてバグを解決するためです)。ファイルの種類>詳細設定で適切に「開く/編集」の組み合わせを機能させることが問題になりました。 Crimson Editorが使用するDDEコードを知っていれば、物事が簡単になります。しかし、この投稿の時点では、私はそれを見つけることができませんでした。

これは、初歩的なAppleScriptのスクリプト機能以上のものを求めてアプリケーションをスキャンしていたMac時代(1993-2008)を思い出させます。

BZT

0
silversleevesx