Чи можуть гіт-баш та цигувін-шкаралупа робити те саме?


13

Чи можуть Git-Bash та cygwin shell робити те саме?

Що можна зробити, але інший не може?

Наприклад,

  1. Як оболонки, вони можуть працювати так само, як баш?
  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 інтерпретуючи "\" як символ втечі. (Редагувати: ви можете спробувати замінити один \ двома, тим самим уникнути зворотної косої риси, щоб Bash передав команду через reg.exe правильно.)

Сказавши це, хоча Cygwin обробляє імена траєкторій Windows, це не любить робити. Документація попереджає вас від їх використання. Зрозуміло, трохи назад ковзання раз у раз не зашкодить. Але хоча ви можете запускати програми Windows у Cygwin, гігієна пропонує вам запускати програми Windows у процесорі CMD.EXE та UNIX в Cygwin для довгострокової безпеки.


1
Ви можете використовувати cygpath для перетворення між форматами Windows та Unix.
DavidPostill

Дякую. Ім'я шляху в моїх командах використовується як ключі в таблиці реєстру, тому чи можна "\" в них замінити на "/"?
Тим

Можливо, але дивіться пропозицію у (щойно відредагованій) відповіді.
Завжди слухання

1

Між ними є велика кількість перекриттів. Але в кінцевому рахунку вони є різними реалізаціями bash / will в Windows.

Cygwin має великий пакет додаткового програмного забезпечення, яке ви можете встановити, включаючи безліч різних мов програмування, компілятори, різні мережеві інструменти тощо. Ви також можете встановити X та багато додатків X.

Завдяки git bash ви отримуєте те, що отримуєте, і встановити додаткові інструменти трохи складніше. У мене фактично є обидва на своїй робочій станції, тому що в git bash є речі, які я не можу зробити. Я мав дуже неоднозначний успіх, коли дзвонили програми cygwin через вікно git bash.

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

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


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)

Це просто говорить про те, що у поточному каталозі не існує жодного файлу, що закінчується .xml у випадку тесту cygwin. Ви повинні показати результат lsу поточному каталозі з командою.
Пітер -

Я вважаю, що це не так, оскільки я запускаю один і той же сценарій у двох терміналах одночасно. Файл є.
WesternGun

2
Є дві можливості: (1) Такого файлу немає, можливо, тому що скрипт cygwin працює в іншому каталозі. У цьому випадку оболонка залишає шаблон сам (замість того, щоб замінювати його порожнім рядком). (Це звучить як майже завжди помилка, поки хтось не зрозуміє, що можна передавати шаблони findтаким чином без котирування.) (2) Імена файлів насправді * .XML (з великими літерами), а параметр оболонки nocaseglobвстановлюється під час створення оболонки git регістр глобусів нечутливий (що має певний сенс у Windows).
Пітер -
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.