Версии g ++, вызываемые из zsh скрипта и вручную из терминала, отличаются - PullRequest
0 голосов
/ 02 августа 2020

Недавно я установил g++-10 с Homebew на MacOS 10.14.6. Я создал псевдоним в своем файле .zshrc:

alias g++="/usr/local/bin/g++-10"

для автоматической компиляции и запуска в терминале. Я создал файл .sh. Однако я заметил, что версия g ++, используемая при вызове g ++ вручную из терминала, следующая:

$ g++ --version
g++-10 (Homebrew GCC 10.2.0) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

, что не совпадает с той, которая вызывает g ++ из сценария .sh. Содержимое скрипта displayg++Version.sh:

type g++
g++ --version

, а затем результат вызова скрипта:

g++ is /usr/bin/g++
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Вот результат следующей команды:

$ type g++
g++ is an alias for /usr/local/bin/g++-10

Почему обе версии различаются?

1 Ответ

2 голосов
/ 03 августа 2020

Прежде всего, определения псевдонимов игнорируются в сценарии, если явно не включены. Вы можете включить это, выполнив в своем скрипте a

setopt aliases

, но не забывайте, что это влияет только на псевдонимы, которые определены после , а не раньше.

Во-вторых, .zshr c не обрабатывается сценарием zsh, если явно не разрешено. Из справочной страницы zsh:

Если оболочка интерактивная , команды читаются из / etc / zshr c, а затем из ZDOTDIR / .zshr c .

Вы можете активировать интерактивность, запустив свой скрипт с параметром -i:

zsh -i your_script.zsh

Если вы хотите, чтобы в вашем zsh скрипте выполнялась определенная версия g ++ однако обычным решением является корректировка PATH, чтобы zsh мог найти правильную версию. Например:

PATH=/your/path/to/g++:$PATH zsh your_script.zsh

Если вы всегда хотите, чтобы эта версия g ++ использовалась, вы, конечно, должны соответствующим образом указать PATH в своем .zshr c. Поскольку ваша командная оболочка интерактивна, будет обработан .zshr c, а поскольку PATH является переменной среды, ваш сценарий будет просматривать этот PATH без необходимости делать что-то особенное.

...