Почему ". Myscript" возвращает файл не найден только в одном Git для Windows sh.exe? - PullRequest
2 голосов
/ 22 мая 2019

Я скачал Git с здесь .

Я недавно обнаружил, что есть две копии sh.exe, который обеспечивает оболочку bash.

  1. C:\Program Files\Git\bin\sh.exe
  2. C:\Program Files\Git\usr\bin\sh.exe

Я обнаружил, что между ними существует различие в функциональности.

Например, экземпляр # 1 может запуститьbash script via: . myScript.sh, где для экземпляра # 2 требуется следующий синтаксис: . ./myScript.sh Экземпляр # 2 сообщит об ошибке отсутствующего файла, если используется синтаксис # 1, даже если файл существует.

  1. Почему существует два экземпляра?
  2. Какой из них является "правильным"?
  3. Есть ли документация о различиях между этими реализациями?
  4. Есть ликакая-либо веская причина, по которой я не должен использовать одну или другую?
  5. Является ли разница в функциональности ошибкой?

1 Ответ

2 голосов
/ 23 мая 2019

Почему несколько снарядов?

Похоже, у вас есть одна копия dash (минимальная реализация /bin/sh - быстрая для запуска с несколькими наворотами) и одна копия bash(гораздо большая оболочка с большим количеством расширений, взятых из ksh).bash отключает некоторые своих дополнительных функций при вызове под именем sh, но не все из них.

Одна из функций "bash" добавляет к базовой линии POSIX sh - поисктекущий каталог для файлов, поставляемых с помощью команд . или source, вместо поиска только в PATH, как требует спецификация POSIX sh.


Почему они отличаются?Кто прав?

Соответствующий стандарт указан по https://pubs.opengroup.org/onlinepubs/009695399/utilities/dot.html;, см., В частности, первый абзац раздела RATIONALE:

Некоторые старые реализации искали файл в текущем каталоге, даже если значение PATH не разрешено.Это поведение было опущено в этом томе IEEE Std 1003.1-2001 из-за опасений по поводу появления уязвимости для троянских коней, которую пользователь может пытаться избежать, оставляя точку вне PATH.

Поиск старых оболочек. в дополнение к каталогам в PATH.Однако по соображениям безопасности спецификация POSIX sh не требует такого поведения;пользователь, который не помещает . в PATH, по-видимому, хочет иметь возможность cd в каталогах, содержимым которых он не управляет или которым он не доверяет, не беспокоясь о типосквоттинге или других атаках.

Предполагается, чточто каталог, содержащий myscript.sh, отсутствует в PATH, оболочка, которая сообщает «файл не найден», является более строгой, чем другая.

...