Переменная среды $SHELL предназначена только для интерактивных оболочек?

Переменная среды $SHELL предназначена только для интерактивных оболочек?

Я вижу два возможных варианта использования SHELLпеременной окружения:

  • Его можно использовать для указанияинтерактивныйоболочка, которую пользователь хочет использовать, и/или
  • его можно использовать в процессах для выполнения других команд, заменяя команду в обычном /bin/sh -c "..."языке.

Если бы он использовался только для первого, это могло бы быть чем-то очень странным (например ipython), если он также будет использоваться для второго, он должен обеспечивать базовую форму совместимости с POSIX, например, понимать параметр -cи сохранять среду нетронутой (что на удивление сложно).

Theстандарт POSIXздесь не очень ясно, просто написано.

Эта переменная должна представлять путь к интерпретатору предпочитаемого пользователем языка команд. Если этот интерпретатор не соответствует Shell Command Language в томе Shell and Utilities IEEE Std 1003.1-2001, Глава 2, Shell Command Language, утилиты могут вести себя иначе, чем описано в IEEE Std 1003.1-2001.

Является ли второе использование на самом деле распространенным и/или допустимым, и, следовательно, стоит ли беспокоиться, если я установлю SHELLчто-то странное?

решение1

Ни один из API POSIX C не использует SHELLпеременную окружения явно.systemиpopenФункция должна вызывать программу с именем sh. Несколько утилит (например,ex,mailx, …) необходимо использовать $SHELL, но всегда для выполнения кода, предоставленного пользователем;makeявно игнорирует $SHELL.

Раздел опеременные средыпозволяеткоммунальные услуги, но не API-интерфейсы C («системные интерфейсы»), чтобы иметь другое поведение, если $SHELLоно не соответствует POSIX sh.

На практике SHELLустанавливается в соответствии с оболочкой входа пользователя, которая может быть совместима с POSIX или нет.Зширыбапопулярные альтернативы. Я использую zsh уже десять лет на различных вариантах Unix, и не помню, чтобы какая-либо системная утилита дала сбой. Я видел случайный небрежно написанный код, вызывающий $SHELLвместо shвыполнения скриптов sh. Это случается довольно редко и не должно удерживать вас от установки SHELLна то, что вам нравится.

Короче говоря, да, SHELLэто ваша любимая интерактивная оболочка, и приложения не получают никаких гарантий относительно того, какой синтаксис она принимает, или даже принимает ли она какие-либо -cопции.

Связанный контент