Могут ли git-bash и cygwin shell делать одно и то же?

13

В Windows 10 могут ли git-bash и cygwin shell делать одно и то же?

Что один может сделать, а другой нет?

Например,

  1. Как оболочки, могут ли они работать так же, как Bash?
  2. Какие программы и команды могут выполняться в одной, но не в другой?

    Например, в git-bash я не могу запустить какую-то команду Windows:

    $  reg add "HKCU\Software\Microsoft\VisualStudio\14.0_Config\MSBuild" /v EnableOutOfProcBuild /t REG_DWORD /d 0 /f
    ERROR: Invalid syntax.
    Type "REG ADD /?" for usage.
    

    Но в Cygwin он работает хорошо

    $  reg add "HKCU\Software\Microsoft\VisualStudio\14.0_Config\MSBuild" /v EnableOutOfProcBuild /t REG_DWORD /d 0 /f
    The operation completed successfully.
    

    Первоначально я думал, что git-bash и cygwin могут запускать программы в Windows. Так почему же не работает git-bash, а Cygwin -?

Спасибо.

Тим
источник

Ответы:

10

Разница в том, что Cygwin знает, как обрабатывать так называемые "Win32" пути. Грубо говоря, он знает, что «\» является разделителем пути, а не экранирующим символом оболочки, как в Bash. Ошибка, которую вы показали, это то, что Bash интерпретирует "\" как escape-символ. (Изменить: вы можете попробовать заменить один \ на два, чтобы избежать обратной косой черты, чтобы Bash правильно передал команду в reg.exe.)

Сказав это, в то время как Cygwin ищет имена для Windows, ему это не нравится. Документация предупреждает вас от их использования. Конечно, немного сползание назад время от времени не повредит. Но в то время как вы можете запускать программы Windows в Cygwin, гигиена предлагает вам запускать программы Windows на процессоре CMD.EXE и программы UNIX на Cygwin для вашего длительного здоровья.

AlwaysLearning
источник
1
Вы можете использовать cygpath для преобразования между форматами путей windows и unix.
DavidPostill
Спасибо. Путь в моих командах используется в качестве ключей в таблице реестра, поэтому можно ли заменить в них "\" на "/"?
Тим
Возможно, но посмотрите предложение в (отредактированном) ответе.
AlwaysLearning
1

Между ними много общего. Но в конечном итоге это разные реализации bash / must в Windows.

Cygwin имеет большое количество дополнительного программного обеспечения, которое вы можете установить, включая несколько разных языков программирования, компиляторы, различные сетевые инструменты и так далее. Вы также можете установить X и многие X-приложения.

С git bash вы получаете то, что получаете, и немного сложнее установить дополнительные инструменты. На самом деле у меня есть оба на моей рабочей станции, потому что есть вещи, которые я не могу сделать в git bash. У меня был очень смешанный успех, вызывая приложения cygwin из окна git bash.

Кроме того, cygwin - это полноценная posix-среда, а не просто интерпретатор bash, поэтому вы часто можете скомпилировать внутри нее нераспределенный код, поэтому, например, если вы нашли источник интересного инструмента Linux, который вы нашли, вы обычно можете скомпилировать этот инструмент для Cygwin. Не так много для мерзавца. И, как я упоминал выше, даже если вы скомпилируете его для Cygwin, он, скорее всего, не будет работать в git bash.

Кроме этого они в основном очень похожи. Довольно забавно видеть, что в git bash есть cygpathкоманда для преобразования путей к файлам Windows и Posix, потому что git bash afaik основан на MinGW, отличном от Cygwin.

romulusnr
источник
0

Я просто нашел разницу: я могу запустить этот скрипт в Git Bash, но не в Cygwin.

for file in *.xml; do
    echo "Processing file: $file"
    sed -r 's:<Autorizado>([0-9]+)</Autorizado>:<Autorizado>00013069</Autorizado>:' -i "$file"
    # ...
done

В Git bash он обрабатывает мои xml-файлы, но в Cygwin выдает ошибку:

Processing file: *.xml
sed: cannot read *.xml: No such file or directory

bash --version в Git Bash:

GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)

в Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)
WesternGun
источник
Это просто говорит о том, что в текущем каталоге нет файла с окончанием .xml в случае теста cygwin. Вы должны показать результат lsв текущем каталоге с помощью команды.
Питер - Восстановить Монику
Я считаю, что это не так, потому что я запускаю один и тот же скрипт в двух терминалах одновременно. Файл там.
WesternGun
2
Есть две возможности: (1) такого файла нет, возможно, потому что скрипт cygwin работает в другом каталоге. В этом случае оболочка оставляет шаблон в покое (вместо замены его пустой строкой). (Это звучит как почти всегда ошибка, пока не поймешь, что можно передавать шаблоны findтаким образом без кавычек.) (2) Имена файлов на самом деле * .XML (в заглавных буквах), и опция оболочки nocaseglobустановлена ​​в git shell, делая Глобус нечувствителен к регистру (что имеет определенный смысл в Windows).
Питер - Восстановить Монику