web-dev-qa-db-ja.com

cygwinを起動して特定のコマンドを実行するバッチファイルを作成する

Cygwinを起動して特定のコマンドを実行するバッチファイルを作成したい(コマンドはbashファイルを読み取り、その中のコマンドを実行する)。

これは私が開発したバッチファイルであり、ある程度機能します。 cygwinターミナルが開き、bashファイルを読み取ろうとしますが、内部のコマンドを実行できません。

@ECHO OFF

C:\cygwin64\bin\mintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)

PAUSE

この作業を行うにはどうすればよいですか?

11
manifertal

バッチファイルからCygwinのbashシェルを起動し、ログインフラグを使用します。これは、.bash_profileまたは.bashrcファイルを介してパスおよび環境変数を設定するための基盤を提供します。これがあなたの困難の原因かもしれないと思います。

@ echo off
C:\cygwin64\bin\bash --login -c "cd ~/path/to/desired; ./mybashfile.sh"

Bashファイルの性質に関する詳細を提供していただければ、さらに具体的に説明できます。幸運を。

13
Patrick Kelly

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インスタンスが作成されます。

7
mklement0