42

このfindコマンドは、Windows と Unix ではまったく異なります。Windows ではfgrep、ファイル内の一致する行を一覧表示する のようなユーティリティです。Unix および Cygwin では、いくつかの基準に一致するファイル名を一覧表示します。

Cygwin bashは標準ディレクトリを現在のパスの先頭$PATHに追加するため、bash 内は通常/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS.

更新を開始して追加の詳細を提供する

たとえば、gnufindコマンドを使用する多くのスクリプトがあります。たとえば、ファイルを含まないディレクトリ ツリーを削除するスクリプトです。

purge-empty-dirs.sh
find . -depth -type d -empty | xargs rmdir -p

ビルドを開始するためのバット ファイルもあります。これは、Windows の find コマンドを使用して、文字列に一致する行を検索します ( gnu に似ていますgrep)。

build.bat
...
dir | find "target"
if errorlevel = 1 goto no_target_dir
...

ここで、bash スクリプトを機能/binさせるには、パスの前にいる必要がありますc:\windows\system32。しかし、バットファイルを実行するにはc:\windows\system32、前にパスにいる必要があります/bin

一般に、すべてのbatファイルは、変更されたものではなく、bashによって継承された元の環境で実行されるべきであると主張できるかもしれません. それは理にかなっていますか?

更新終了

これは本来あるべき姿ですが、bash から実行されたバット ファイルが壊れます。これに対処する最善の方法は何ですか?

Cygwin が起動した環境で強制的にバット ファイル (またはすべてのWindows 実行可能ファイル) を実行する方法はありますか? start /icmd.exeの動作を考えています。/cygstartに環境 (または少なくとも$PATH) を保存することにより、これを行う独自の同様のユーティリティを作成することを考えています。それは理にかなっていますか? .bash_profile.bashrc

他の提案はありますか?

編集:新しいcmd.exeを開始し、環境を継承しないも参照してください

4

5 に答える 5

5

ここからソリューションをテストしましたが、うまく機能します:

start "clean shell" /i "%windir%\explorer.exe" "\path\to\your\script.bat"

to-run.bat脚本:

echo %PATH%
echo "TODO: some commands"
cmd

cygwinbash スクリプト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
于 2014-06-21T05:55:13.433 に答える
1

@ruslo によって与えられた答えは非常に便利で、問題なく動作しますが、冗長性がstart "clean shell" /Iありexplorerますstart /i。次のように、スクリプトの最後の行から省略してみてください。

cmd /C "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"

同じ結果 - 「元のパス」!

のヘルプを熟読すると、次のように書かれstartています。新しい環境は、現在の環境ではなく、cmd.exe に渡された元の環境になります。cmdしかし、この場合に渡される環境は の環境cygwinであるため、次のようstart /iに入力するとわかるように、ここでは何も役に立ちません。

cmd /c start /i cmd /c "path && pause"

パスはcygwinWindows システムではなく のパスのままです!

于 2016-12-08T05:19:18.537 に答える
1

=== build.bat スクリプトで...

SET "DOS_FIND_EXE=%SYSTEMROOT%\System32\find.exe"
...
dir | "%DOS_FIND_EXE%" "target"
if errorlevel 1 goto no_target_dir
...
于 2014-03-11T17:44:16.877 に答える