В чем разница между env, setenv, export и когда использовать?

Учитывая, что ваш start-stop-daemon имеет размер 4 ГБ и датирован 31 декабря 1969 г., я подозреваю, что ваш файловая система может быть повреждена ...

sudo touch /forcefsck

, а затем перезагрузитесь, чтобы проверить файловую систему.

Знак вопроса в выводе ls здесь происходит из массива filetype_letter array (в GNU ls ):

/* Display letters and indicators for each filetype.
   Keep these in sync with enum filetype.  */
static char const filetype_letter[] = "?pcdb-lswd";

Это соответствует C_ORPHAN :

#define FILETYPE_INDICATORS                             \
  {                                                     \
    C_ORPHAN, C_FIFO, C_CHR, C_DIR, C_BLK, C_FILE,      \
    C_LINK, C_SOCK, C_FILE, C_DIR                       \
  }

и unknown в filetype enum , и является значением по умолчанию для файла неизвестного типа :

          /* Classify a file of some other type as C_ORPHAN.  */
          type = C_ORPHAN;

(реализации ls могут добавлять свои собственные символы к тем , определенным POSIX .)

18
04.06.2017, 01:32
3 ответа

export VARIABLE_NAME='some value' — способ установить переменную среды любая POSIX-совместимая оболочка (sh, dash, bash, ksh и т. д.; также zsh). Если у переменной уже есть значение, вы можете использовать export VARIABLE_NAME, чтобы сделать ее переменной среды без изменения ее значения.

Pre-POSIX оболочки Bourne не поддерживали это, поэтому вы увидите сценарии, которые избегают export VARIABLE_NAME='some value' и используют VARIABLE_NAME=' некоторое значение'; вместо этого экспортируйте VARIABLE_NAME. Но оболочки Bourne до POSIX в настоящее время крайне редки.

setenv VARIABLE_NAME='некоторое значение' — это синтаксис csh для установки переменной среды. setenv не существует в sh, а csh крайне редко используется в скриптах и ​​за последние 20 лет превзошел bash по интерактивному использованию (а zsh и того дольше), так что про него можно забыть разве что вы сталкиваетесь с этим.

Команда env очень редко полезна, за исключением shebang lines.При вызове без аргументов он отображает среду, но export делает это лучше (сортируется и часто цитируется для устранения неоднозначности новых строк в значениях от новых строк, которые разделяют значения). При вызове с аргументами он запускает команду с дополнительными переменными среды, но та же команда без env также работает (VAR=value mycommand запускает mycommand с VAR устанавливается в значение, точно так же, как env VAR=значение mycommand). Причина, по которой env полезна в строке shebang, заключается в том, что она выполняет поиск PATH и не делает ничего другого при вызове с именем команды. Команда env может быть полезна для запуска команды только с несколькими переменными среды с -i или без параметров для отображения среды, включая переменные с недопустимыми именами, которые не поддерживает оболочка. Импортировать.

33
27.01.2020, 19:46

Установка переменной типа VAR='asdf' оставляет среду неизменной, а это означает, что программы, которые вы запускаете в том же сеансе, ничего не знают о VAR и не сможет получить к нему доступ. Вам нужно такое поведение при написании сценариев оболочки.

export, с другой стороны, является встроенной функцией bash, которая изменяет среду, делая экспортируемую переменную видимой для дочерних процессов, порожденных в текущем сеансе. Вы можете добиться того же, запустив VAR='asdf' %program_name%.

env — это не встроенная функция, а отдельная программа. На первый взгляд это работает точно так же, как когда вы VAR='asdf' %program_name%, но на более низком уровне все становится немного сложнее. Сначала запускается env. Он изменяет среду, затем выполняет команду с заданными аргументами. Такого же поведения вы можете добиться в своем собственном коде, используя системный вызов exec(3).

setenv — это просто экспорт в оболочках семейства csh, как указано в вашем ответе.

7
27.01.2020, 19:46

Теги

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