bash: FOO_VARIABLE=foo;./test не передает переменную foo в тест - почему не наследуется?

Проблема неработоспособности unetbootin указана в списке ошибок как вызванная выпуском Debian Jessie, не соответствующим стандартам именования файлов. Стандарты Joliet для имен файлов ограничивают длину до 64 символов. Debian Jessie включает имена файлов, которые выходят за рамки стандарта, используемого в unetbootin.

Комментарии разработчиков в списке ошибок, похоже, превратились в ненавистную -почтовую атаку на unetbootin вместо решения проблемы нарушения стандартов в Debian. Разработчики должны отказаться от войны -за территорию и решить проблему.

Для графических или настольных пользователей Debian и других дистрибутивов Linux важно предоставить графический инструмент для создания загрузочных образов.iso на флэш-накопителях USB -. Использование текстового «дд» не является приемлемым решением. K3B работал для этой цели в более ранних дистрибутивах Debian, но с Jessie это тоже не работает, потому что он отказывается подтверждать вставку носителя с USB-накопителем -.

0
24.10.2019, 09:19
2 ответа

Потому что на данный момент это не переменная окружения, а локальная переменная оболочки. Чтобы это работало, вам нужно export MY_TESTего. Альтернативой может быть это:

env MY_TEST=ret./test

(В Bash также просто MY_TEST=ret./test, но сenvболее переносимы между оболочками.)

Вы могли бы, кстати, проверить и это, заменив свой ./testна env|grep MY_TEST.

В Bash (, но не во всех других оболочках ), вы также можете сказать

Выполнение его в командной строке будет -в этом случае -эквивалентно тому, что вы делаете в сценарии.

Используйте:

export MY_TEST=ret; env|grep MY_TEST

, чтобы проверить, что я написал.

Предполагая, что ./testэто сценарий оболочки (того же диалекта оболочки ), вы также можете использовать

source./test

... чтобы перенести все операторы из ./testв вашу текущую оболочку. Переменная shell/local также будет видна, потому что на самом деле вы не запускаете другой процесс.

Подоболочка имеет собственные настройки (, например. параметры оболочки и рабочий каталог ), но технически выполняются в одном и том же процессе. Так что здесь нет fork(). Если есть fork()аргументы командной строки и переменные окружения, можно было бы передать материал другому сценарию/исполняемому файлу.


Это отличается от случая, когда подоболочка наследует оболочки/локальные переменные родительской оболочки:

TEST=ret; (echo "shell variable=$TEST"; env|grep TEST)

Здесь подоболочка (внутри(...))увидит переменную, но это все еще не переменная окружения.

1
28.01.2020, 02:22

В первой команде

FOO_VARIABLE=foo;./test

вы присваиваете переменной оболочки FOO_VARIABLEзначение. Затем вы звоните ./test. Поскольку FOO_VARIABLEне экспортируется, это не переменная среды, и поэтому она не будет унаследована никаким скриптом или программой, которую вы запускаете.Вот почему ./testне знает о переменной.

Вкратце :Вы устанавливаете переменную оболочки "здесь", но она не будет доступна "там" (в./test).

В другой команде

FOO_VARIABLE=foo./test

вы устанавливаете значение FOO_VARIABLEв среде ./test(, т.е. вы создаете переменную среды для ./testс именемFOO_VARIABLE). Переменная не устанавливается в текущей среде ни как переменная среды, ни как переменная оболочки, только для процесса, полученного в результате запуска ./test.

Вкратце :Вы установили переменную окружения "там" (в ./test), но не "здесь".

Если у вас есть существующая переменная FOO_VARIABLE, которую вы хотите, чтобы скрипт или программа наследовала как переменную окружения, вам придется exportее унаследовать, т.е. сделать из нее переменную окружения:

FOO_VARIABLE=foo
export FOO_VARIABLE
./test

или, короче,

export FOO_VARIABLE=foo
./test

Это устанавливает переменную локально, а также делает ее доступной в любом созданном процессе (в ./test, например ).

2
28.01.2020, 02:22

Теги

Похожие вопросы