find
コマンドは、WindowsとUnixでまったく異なります。 Windowsでは、ファイル内の一致する行をリストするfgrep
のようなユーティリティです。 Unix上およびCygwin上では、いくつかの基準に一致するファイル名をリストします。
Cygwin bashは、その標準ディレクトリを現在のパスの先頭に追加します。したがって、bash内では$PATH
は通常/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS
です。
追加の詳細を提供するために更新を開始
たとえば、gnu find
コマンドを使用する多くのスクリプトがあります。たとえば、ファイルを含まないディレクトリツリーを削除するスクリプトなどです。
purge-empty-dirs.sh
find . -depth -type d -empty | xargs rmdir -p
また、文字列に一致する行を検索するwindows findコマンドを使用して、ビルドを開始するbatファイルがあります(gnu grep
と同様)。
build.bat
...
dir | find "target"
if errorlevel = 1 goto no_target_dir
...
ここで、bashスクリプトが機能するには、/bin
がc:\windows\system32
の前にある必要があります。しかし、batファイルを実行するには、c:\windows\system32
が/bin
の前にある必要があります
一般に、すべてのbatファイルは、変更された環境ではなく、bashによって継承された元の環境で実行されるべきだと主張できるかもしれません。それは理にかなっていますか?
更新の終了
これはどうあるべきかですが、bashから実行されたbatファイルを破壊します。これに対処する最良の方法は何ですか?
Cygwinに、それを開始した環境でbatファイル(またはallWindows実行可能ファイル)を強制的に実行させる方法はありますか? cmd.exeのstart /i
動作を考えています。環境(または少なくとも$PATH
)を.bash_profile
/.bashrc
に保存して、これを行う独自のcygstart
のようなユーティリティを作成することを考えています。それは理にかなっていますか?
他の提案はありますか?
編集:参照 新しいcmd.exeを開始し、環境を継承しない
here のソリューションをテストしましたが、うまく動作します:
start "clean Shell" /i "%windir%\Explorer.exe" "\path\to\your\script.bat"
to-run.bat
脚本:
echo %PATH%
echo "TODO: some commands"
cmd
cygwin
bashスクリプト、run-me.sh
:
#!/bin/bash -e
set -x
SCRIPT_WINPATH=`cygpath --windows --absolute "$1"`
Explorer_CYGPATH=`which Explorer`
Explorer_WINPATH=`cygpath --windows --absolute "${Explorer_CYGPATH}"`
cmd /C start "clean Shell" /I "${Explorer_WINPATH}" "${SCRIPT_WINPATH}"
テスト:
chmod +x to-run.bat
chmod +x run-me.sh
./run-me.sh to-run.bat
内容は次のような_launcher.bat
_などのラッパーを使用できます。
_@echo off
setlocal
rem modify here based on your needs
set PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
call %*
endlocal
exit %errorlevel%
_
Cygwin bashスクリプトから、_cmdFUBAR.bat
_を引数wellDoneMS
で呼び出し、_cmdFUBAR.bat wellDoneMS
_を呼び出す代わりに、_cygstart -w launcher.bat cmdFUBAR.bar wellDoneMS
_を実行するとします。もちろん、_launcher.bat
_をパスに入れるか、フルパスで呼び出す必要があります。
@rusloによって与えられた答えは非常に便利でうまく動作しますが、冗長性があります:start "clean Shell" /I
はここでは何もしません:-)現在のcygwin envを取り除くのはExplorer
ピースですstart /i
ではありません!次のように、スクリプトの最後の行から省略してみてください。
cmd /C "${Explorer_WINPATH}" "${SCRIPT_WINPATH}"
同じ結果-「そのままのパス」!
start
のヘルプを熟読すると、次のように表示されます:新しい環境は、現在の環境ではなく、cmd.exeに渡される元の環境になります。ええと、しかしこの場合cmd
に渡される環境はcygwin
の環境なので、start /i
はここでは何も入力しません。
cmd /c start /i cmd /c "path && pause"
パスはまだcygwin
のパスであり、Windowsシステムではありません!
=== build.batスクリプトで...
SET DOS_FIND_EXE=%SYSTEMROOT%\system32\find.exe
...
dir | "%DOS_FIND_EXE%" "target"
if errorlevel = 1 goto no_target_dir
...