Что означает $ {GZIP_BINDIR - '/ bin'} в bash?

13

Кто-нибудь может объяснить, что означает эта команда?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Рашми Нарахари
источник

Ответы:

19

${GZIP_BINDIR-'/bin'}является bashмодель расширения параметров. От man bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

Непосредственно перед этой частью страницы руководства (спасибо @jwodder за уведомление):

Omitting the colon results in a test only for a parameter that is unset.

Как сказано в man-странице, будет установлено значение переменной по умолчанию GZIP_BINDIR. Если GZIP_BINDIRимеет предварительно установленное значение (отличное от нуля, поскольку вы не используете :), то это значение будет использоваться, в противном случае /binбудет использоваться в качестве значения переменной GZIP_BINDIR.

С другой стороны, если вы хотите проверить и нулевые значения, используйте этот шаблон (include :):

${GZIP_BINDIR:-'/bin'}

После этого значение $PATHбудет расширено до значений, которые оно удерживало ранее. Итак, если PATHраньше было:

/usr/sbin:/usr/bin

Теперь ваше PATHбудет (учитывая GZIP_BINDIRне установлено):

/bin:/usr/sbin:/usr/bin

export PATHсделает это PATHдоступным для всех дочерних процессов.

heemayl
источник
« Я думаю, что вы пропустили :в${GZIP_BINDIR-'/bin'} » Не обязательно. ${parameter-word}тоже допустимо, хотя, похоже, его нет на странице руководства.
nyuszika7h
@ nyuszika7h Да .. я не знал этого раньше ..
странно,
На man-странице bash на моем компьютере в параграфе справа над разделом :-написано: «Когда не выполняется раскрытие подстроки, используйте формы, задокументированные ниже (например, :-), тесты bash для неустановленного или нулевого параметра. Пропуск двоеточия» приводит к проверке только для
неустановленного
Как примечание, вы можете объединить настройки PATHи exportв одну команду следующим образом:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau
8

Действительно ли нет двоеточия перед дефисом внутри расширения параметра ${GZIP_BINDIR-'/bin'}?

Конструкция такого типа почти всегда пишется с двоеточием, ${GZIP_BINDIR:-'/bin'}что означает, что «если $ GZIP_BINDIR равен NULL или не задан, установите его в« / bin »»

Однако синтаксис вы указали является допустимым, но редко. ${GZIP_BINDIR-'/bin'}(без двоеточия) означает, что «если $ GZIP_BINDIR не установлен, установите его в« / bin »». Если он установлен (был объявлен), но ему ничего не назначено (например, он равен NULL), то ничего не будет вставлено.

Однако здесь может быть ошибка, так как двоеточие после конструкции переменной (...} :$ PATH ...) все равно будет вставлено, если установлено значение $ GZIP_BINDIR, но NULL. Так как это добавит двоеточие в начале $ PATH, это приведет к тому, что текущий каталог будет найден первым.

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

Чтобы оставить $ PATH без изменений, если установлено значение $ GZIP_BINDIR, но NULL (пусто), правильный синтаксис будет ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

Чтобы оставить $ PATH без изменений, если $ GZIP_BINDIR либо не установлен, либо установлен, но имеет значение NULL, правильный синтаксис будет ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH

DocSalvager
источник
2

Эта команда обновляет переменную PATH.

PATHЭто переменная окружения , указав набор каталогов , где исполняемые программы расположены.

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

Это добавит значение другой переменной, GZIP_BINDIRесли выйти из предыдущего PATH, иначе использовать / bin вместо этого и добавить его в PATH

export PATH

Экспорт используется для установки PATH, доступного для всех дочерних процессов и подоболочек. Прочитайте это для получения дополнительной информации о

Вы должны заметить, что это не статично, и вы потеряете его после выхода из оболочки.

Чтобы сделать это редактирование PATH постоянным, вы должны добавить эти строки в ваш .bashrc

gedit .bashrc

и добавьте строку

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

затем запустите команду

source .bashrc
Maythux
источник
GZIP_BINDIR - переменная
Maythux
что не так? Нет я не сделал? мой также проголосовал
Maythux
Почему даунтинг?
Maythux