Если процессы наследовали среду родителя, почему мы должны экспортировать?

Не непосредственно через zip, но (cd test && zip -r ../test.zip *) должен сделать.

Править: Я не знаю об опции в zip, которая позволяет эквиваленту tar -cf test.tar -C test . (который делает точно, что Вы хотите).

72
23.05.2017, 15:40
3 ответа
[1132046] Ваше предположение, что переменные оболочки - это [1132450] в окружении [1132451]. Это неправильно. Команда [1132452]export[1132453] вообще определяет имя, которое должно быть в окружении. Таким образом:
  • приводит к тому, что текущая оболочка [1132454]shell[1132455] знает, что [1132456]$a[1132457] расширяется до 1 и [1132458]$b[1132459] до 2, но подпроцессы не будут знать ничего о [1132460]a[1132461], потому что она не является частью окружения (даже в текущей оболочке).
  • Некоторые полезные инструменты:

    set[1132994]: Полезен для просмотра параметров текущей оболочки, экспортируется или нет


    set -k[1132996]: Устанавливает [1132997]назначенный args[1132998] в окружении. Рассмотрим [1132999]f() { set -k; env; }; f a=1

    set -a[1133002]: Говорит оболочке поместить в окружение любое имя, которое получит множество. Аналогично добавлению [1133003]export[1133004] перед каждым присваиванием. Полезно для файлов [1133005].env[1133006], как в наборе [1133007] -a; ..env; set +a[1133008].

    export[1133010]: Говорит оболочке поместить имя в окружение. Экспорт и присвоение - две совершенно разные операции.

    env[1133012]: Как внешняя команда, [1133013]env[1133014] может рассказать только об унаследованном окружении [1133015], таким образом, это полезно для проверки здравомыслия.

    env -i[1133018]: Полезно для очистки среды перед запуском подпроцесса.

    Альтернативы [1132474]export[1132475]:

    name=val command[1133020] # Assignment before command exports that name to the command.

    declare/local -x name[1133022] # Export name, особенно полезно в функциях оболочки, когда вы хотите избежать выведения имени за пределы области видимости.

    set -a[1133024] # Экспортирует каждое последующее присваивание.

    75
    27.01.2020, 19:31
    [1132038]Переменная, после экспорта, является частью окружения. [1132442]PATH[1132443] экспортируется в самой оболочке, в то время как пользовательские переменные могут экспортироваться по мере необходимости. Используя некоторый установочный код:

    • Сравнить
    • С
    • Так как [1132444]foo[1132445] не экспортируется оболочкой, а [1132446]test2.sh[1132447] никогда не экспортируется, в последнем запуске он не был частью среды [1132448]subhell.sh[1132449].[1132045].
    6
    27.01.2020, 19:31
    [1132034] Есть разница между переменными оболочки и переменными окружения. Если вы определяете переменную оболочки без [1132432]export[1132433]ing, она не добавляется в окружение процессов и, следовательно, не наследуется дочерними процессами.

    Используя [1132434]export[1132435], вы говорите оболочке добавить переменную оболочки в окружение. Вы можете протестировать это, используя [1132436]printenv[1132437] (который просто печатает свое окружение в [1132438]stdout[1132439], так как это дочерний процесс, вы видите эффект [1132440]export[1132441]ing переменных):

    24
    27.01.2020, 19:31

    Теги

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