Cygwinを起動して特定のコマンドを実行するバッチファイルを作成したい(コマンドはbashファイルを読み取り、その中のコマンドを実行する)。
これは私が開発したバッチファイルであり、ある程度機能します。 cygwinターミナルが開き、bashファイルを読み取ろうとしますが、内部のコマンドを実行できません。
@ECHO OFF
C:\cygwin64\bin\mintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)
PAUSE
この作業を行うにはどうすればよいですか?
バッチファイルからCygwinのbashシェルを起動し、ログインフラグを使用します。これは、.bash_profile
または.bashrc
ファイルを介してパスおよび環境変数を設定するための基盤を提供します。これがあなたの困難の原因かもしれないと思います。
@ echo off
C:\cygwin64\bin\bash --login -c "cd ~/path/to/desired; ./mybashfile.sh"
Bashファイルの性質に関する詳細を提供していただければ、さらに具体的に説明できます。幸運を。
Patrick Kellyの有用な回答 not としてbash
を login Cygwinのシェルとして実行すると、問題。
実際:Cygwin bash
を常に login Shellとして実行します。そうしないと、重要な初期化が行われないためです;特に、$PATH
変数には/usr/local/bin:/usr/bin
が含まれず、ロケールは正しく設定されません。
bash
に login シェルを開始させるには、 bash実行可能ファイルに-l
オプション(またはより長いエイリアス)を渡す必要があります、--login
)。
スクリプトを実行するには:
current コンソールウィンドウで、 Patrick's answer を参照してください。
ターゲットスクリプトが特定の作業ディレクトリに依存している場合を除き、-c
を個別のcd
および実行コマンドと一緒に使用することは厳密には必要ありません。次のようなことができます:
C:\cygwin64\bin\bash -l c:\path\to\your\script
in mintty.exe
、Cygwinに付属するターミナルアプリケーション(試したとおり):
C:\cygwin64\bin\mintty /bin/bash -l c:\path\to\your\script
mintty
を実行すると、常に new コンソールウィンドウが開き、 asynchronously が開きます。 Windows -styleパスを(代替として)使用してターゲットスクリプトを指定する方法に注意してください(つまり、c:\cygwin64\bin\bash
の代わりに/bin/bash
も使用できます) 。
さらに重要なことに、両方のケースでbash
実行可能ファイルへの明示的な参照が必要に注意してください。これはあなたが試したこととは対照的です。
mintty.exe
に渡すオプションは it に固有です-それらは not bash
に渡されます。具体的には、使用しているmintty.exe
オプションは次のとおりです(mintty --help
を実行してすべてのオプションを表示します)。
-l, --log FILE|-
...ファイルまたは標準出力へのログ出力-i, --icon FILE[,IX]
...ファイルからウィンドウアイコンを読み込み、オプションでインデックス付きしたがって、-li
は、現在のディレクトリにi
という名前のログファイルを作成します。これは、i
が個別のオプションl
ではなく、i
のオプション引数として解釈されるためです。
ただし、指定されたスクリプト(/cygdrive/c/...
)は引き続き実行されますが、決定的には、ログインシェルではありません。
上記のように、bash
実行可能ファイルを明示的に呼び出す必要があるため、オプションは Bash によって解釈されます。
C:\cygwin64\bin\mintty /bin/bash -li c:\path\to\your\script
また、前述のように、mintty.exe
をバッチファイルから実行すると、常に new コンソールウィンドウが作成され、 asynchronously -つまり、mintty.exe
プロセスがまだ終了しているかどうかに関係なく、バッチファイルはすぐにPAUSE
コマンドに進みます。
明らかに、新しいウィンドウに出力されるものはすべて、元のウィンドウには表示されません。
mintty.exe
ウィンドウとの対話:警告:mintty.exe
は、バッチファイルから通常のstart /wait
アプローチを使用している場合でも、 asynchronously を実行します。つまり、mintty.exe
が終了するまでバッチファイル/コマンドプロンプトをブロックする次の試みは not 動作します:
start /wait "" "c:\cygwin64\bin\mintty" # !! DOES NOT WORK - still asynchronous
スクリプト/コマンドが渡されたとき、mintty.exe
によって作成されたBashセッションは常に、スクリプトが終了するときに exit になります。なぜなら、bash
- interactive セッションを示す-i
-その場合自動的に終了します。
必要なのは、 inspect スクリプト終了後の出力のみである場合、次を実行します。
c:\cygwin64\bin\mintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script
スクリプトが終了すると、そのウィンドウでシェルは実行されないため、できることは inspect スクリプトの出力だけです。
シェルを開いたままにするには、回避策が必要です。
c:\cygwin64\bin\mintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"
これにより、スクリプトの終了後に new Shellインスタンスが作成されます。