Вопрос или проблема
Что произойдет, если я выполню эту команду set
, предназначенную для командной строки Windows, в Bash в Linux?
set "PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%"
echo %PATH%
В командной строке Windows это изменяет PATH в соответствии с моими потребностями, чтобы я мог запускать Git\bin\bash.exe
как bash
напрямую в командной строке Windows.
Когда я запускаю это в Git Bash на Windows или в Bash в Linux Ubuntu, ошибок не возникает. Команда, кажется, выполняется нормально, но ничего не происходит. Как мне проверить, что случилось? Безопасно ли это выполнять в Linux? Мне не нужно, чтобы это что-то делало в Linux, но чтобы установить PATH в Windows.
Для тех, кто интересуется:
Почему это? Мне нужен один скрипт, который будет работать как в командной строке Windows, так и в Linux Bash, и это будет перед начальным кодом, который запускает скрипт в обоих случаях. Это связано с моим Q&A здесь: Как сконфигурировать Bash-скрипт preBuildSteps.sh
, который выполняется в рамках предшествующего процесса сборки в MPLAB X IDE как на Windows, так и на Linux.
Команда set
в Bash универсальна, но когда она используется таким образом, она не устанавливает переменные окружения – любые неопциональные аргументы, которые она принимает, фактически помещаются в параметры оболочки $1..$9
(равные %1..%9
в Cmd).
$ echo "$1"
(ничего)
$ set a=bc def gh=ijkl
$ echo "$1"
a=bc
$ echo "$a"
(ничего)
О, я понял. В Linux позиционные параметры $1
, $2
, $3
и т.д. могут быть изменены с помощью команды set
. Я об этом забыл. Итак, set whatever
просто устанавливает первый позиционный параметр, доступный через $1
, в строку whatever
.
Вы можете увидеть это здесь в Bash в Linux:
$ set whatever
$ echo $1
whatever
Таким образом, set "PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%"
просто устанавливает позиционный параметр $1
в строку PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%
. Это безвредно. Идеально для моих нужд!
$ set "PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%"
$ echo $1
PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%
Теперь я помню: я писал об этом некоторое время назад здесь: Как изменить аргументы командной строки $1
, $2
и т.д. в Bash, используя set --
Ответ или решение
Если вы выполните команду set
, предназначенную для командной строки Windows, в среде Bash на Linux, произойдут следующие события и взаимодействия:
1. Команда set
в контексте Bash
В Bash команда set
не используется для установки переменных среды так, как это делается в командной строке Windows (cmd). Вместо этого, команда set
в Bash управляет позиционными параметрами и переменными оболочки. Ваша команда:
set "PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%"
просто присваивает строку PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%
переменной $1
. Это происходит без каких-либо ошибок, так как Bash не распознает символы или переменные окружения, которые специфичны для Windows.
2. Понимание поведения set
Когда вы запускаете команду set
, Bash воспринимает всё после команды как строку, которую необходимо присвоить первому позиционному параметру ($1
). Например, после выполнения следующей команды:
set "abc"
вы можете проверить значение $1
:
echo $1 # будет "abc"
Таким образом, в вашем случае, $1
теперь будет содержать следующую строку:
PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%
3. Проверка изменений
Вы можете проверить, что никаких изменений в переменной окружения PATH
не произошло, выполнив команду:
echo $PATH
Строка вывода покажет текущие значения переменной PATH
вашей среды Linux, которые останутся неизменными.
4. Безопасность выполнения команды
Запуск данной команды в Bash на Linux абсолютно безопасен. Поскольку она не производит никаких действий, изменяющих среду или поведение системы, вы можете без опасений использовать её в ваших сценариях. Этим она подходит для запуска вашего скрипта как в Windows, так и в Linux, не вызывая побочных эффектов.
5. Заключение
Таким образом, команда set
в данном контексте не делает ничего влияющего на вашу систему и просто работает как способ привязки текстового значения к первому позиционному параметру. Это поведение помогает создать удобный кроссплатформенный скрипт, который может вводить параметры и сохранять консистентность выполнения без каких-либо нежелательных изменений окружения в Linux.
Если у вас есть дополнительные вопросы или необходима помощь в дальнейших разработках, не стесняйтесь обращаться.