переменная среды gcc unix - PullRequest
0 голосов
/ 29 января 2012
src="binds.c engine.c console.c"
echo $src
gcc $src

Пакетный файл выше работает с эхом, но gcc не работает.Если я наберу gcc $src в командной строке, это работает.Таким образом, кажется, что gcc не получает локальные переменные среды в командном файле?

Использование CYGWIN.

1 Ответ

1 голос
/ 30 января 2012

Если вы используете Cygwin, то вы работаете в Windows в режиме эмуляции Unix. Довольно хороший, но все еще подражание. Тем не менее, вы также, вероятно, используете bash в качестве своей оболочки, что хорошо (и если по какой-то случайности вы используете оболочку Korn, то, что я говорю ниже, применяется в равной степени, и если вы используете /bin/sh, это эффективно подмножество bash и то, что я говорю, применимо и к этому).

Обратите внимание, что вы можете определять переменные в вашей оболочке, которых нет в окружении оболочки. Это различие важно, когда дело доходит до запуска других скриптов.

src="binds.c engine.c console.c"

Это создает переменную вне среды с именем src. Теперь вы можете использовать это в командной строке:

echo $src
gcc -c $src

Команда echo выведет список трех имен, и GCC будет запущен и попытается скомпилировать все три исходных файла. Однако, если вы запустите команду env, вы не увидите src в среде. С другой стороны, если вы запустите команду set, вы увидите src.

env    # No arguments - list the environment variables that are exported
set    # No arguments - lists variables, exported and non-exported

Теперь предположим, что у вас есть (или создан) скрипт с именем compile в текущем каталоге, который содержит:

gcc -c $src

Скрипт должен быть исполняемым (chmod +x compile). Если вы запустите:

./compile

скрипт не видит переменную $src, потому что она не экспортируется, поэтому вы получаете ошибку об отсутствии имен файлов, указанных в GCC. Как ни странно, если вы запустите любой из них:

. ./compile
source ./compile

тогда компиляция происходит так, как вы хотели. Это связано с тем, что вместо запуска вспомогательной оболочки для выполнения сценария текущая оболочка читает сценарий, и определяется переменная src.

Если вы теперь экспортируете src, он становится доступным для вложенных оболочек и других программ:

export src     # Sufficient given the initial assignment
export src="binds.c engine.c console.c" # Set and export; not portable to Bourne shell

Теперь, если вы запустите env, вы увидите src в списке. И теперь, если вы запустите ./compile, в его среде будет переменная src, поэтому компиляция будет происходить, как и ожидалось.

Итак, ключевые моменты:

  • Не все переменные оболочки являются переменными среды.
  • Чтобы превратить переменную в переменную окружения, вы должны export явно указать ее.

Есть некоторые другие приемы, которые можно использовать с переменными окружения, но они еще не имеют отношения к вашей ситуации и скорее запутают, чем помогут. ( Я думаю о set -k и var=value cmd arg1 ... для тех, кто знает. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...