Если вы используете 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 ...
для тех, кто знает. )