Можно ли иметь неинтерактивную оболочку входа в систему (не вызываемую с помощью --login или -l)?
ДА.
$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')
Однако обратите внимание, что
/ etc / profile
не будет использоваться для оболочки входа без взаимодействия, если не указан аргумент- login
.Обычная идиома, вызывающая неинтерактивную оболочку входа в систему:
$ su - someuser -c somecommand
Но при этом страдает тот факт, что
/ etc / profile
не запускается.Это поведение можно изменить, но оно включает настройку исходного кода Bash во время компиляции, раскомментируя параметр, найденный в config-top.h :
/* Define this to make non-interactive shells begun with argv[0][0] == '-' run the startup files when not in posix mode. */ /* #define NON_INTERACTIVE_LOGIN_SHELLS */
Когда я исследовал это
su
аномалия , я обнаружил, что другие оболочки, включаяzsh
иdash
, не имеют этого несоответствия.
Система apt/dpkg позволяет выполнять автоматическую или неинтерактивную установку.
Это включает установку для переменной DEBIAN_FRONTEND
значения noninteractive
и использование флага -y
. Например:
export DEBIAN_FRONTEND=noninteractive
apt-get -y install [packagename]
Если вы получаете ошибки, вам может потребоваться установить параметр q
, чтобы убедить dpkg
в том, что вы на самом деле выполняете неинтерактивную установку: DEBIAN_FRONTEND=noninteractive apt-get -yq install [имя пакета]
.
В некоторых случаях может быть проще следовать подсказкам для некоторых пакетов, которые вы устанавливаете позже в том же процессе скрипта/оболочки, в этом случае вы захотите отменить экспорт переменной DEBIAN_FRONTEND
. :
unset DEBIAN_FRONTEND
Для предварительной настройки параметров конфигурации полезно иметь установленный debconf-utils
, который будет использовать команду debconf-get-selections
:
sudo apt-get install debconf-utils