
Я вижу два возможных варианта использования 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
опции.