Я думаю, что я понимаю разницу между интерактивом, логином и пакетной оболочкой. Смотрите следующие ссылки для получения дополнительной помощи:
- В чем разница между «логином» и «интерактивной» оболочкой bash (с сайта- партнера : serverfault.com )
- 2.1: Типы оболочек: интерактивные оболочки и оболочки входа в систему (от Руководства пользователя до Z-Shell )
У меня вопрос, как я могу проверить с командой / условием, если я нахожусь в интерактивном режиме, входе в систему или пакетной оболочке?
Я ищу команду или условие (которое возвращает true
или false
) и которое я мог бы также поместить в оператор if. Например:
if [[ condition ]]
echo "This is a login shell"
fi
Ответы:
Я предполагаю
bash
оболочку или что-то подобное, поскольку в тегах нет оболочки.Чтобы проверить, находитесь ли вы в интерактивной оболочке:
Чтобы проверить, находитесь ли вы в оболочке входа в систему:
Под «пакетным» я предполагаю, что вы имеете в виду «не интерактивный», поэтому проверки на наличие интерактивной оболочки должно быть достаточно.
источник
zsh
пользователей проверка входа в оболочку может быть выполнена с помощью:if [[ -o login ]] ...
$-
расширяется в текущей оболочке. Если вы используете одинарные кавычки вокруг полного выражения, вы получите правильный результат:bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
В любой оболочке в стиле Борна
i
параметр указывает, является ли оболочка интерактивной:Не существует портативного и полностью надежного способа тестирования оболочки входа. Кш и зш добавить
l
в$-
. Bash устанавливаетlogin_shell
опцию, с которой вы можете запроситьshopt -q login_shell
. В частности, проверьте,$0
начинается ли с-
: shells, как правило, известно, что они являются оболочками входа в систему, потому что вызывающая сторона добавила-
префикс к нулевому аргументу (обычно это имя или путь исполняемого файла). Это не в состоянии обнаружить специфические для оболочки способы вызова оболочки входа (напримерash -l
).источник
$0
с того, с чего-
бы это ни началось. Но есть по крайней мере одно исключение: это не всегда верно для bash, даже если предполагается, что это оболочка для входа. Попробуйте это в своей коробке: вызовитеbash --login
, затем$0
все еще читаетbash
.ракушка
Вот ответ на
fish
случай, если другие пользователи наткнуться на эту страницу.Рыбная документация: инициализация
источник
csh / tcsh
Для
csh
и уtcsh
меня есть следующее в моем.cshrc
файле:Специально для
tcsh
переменнойloginsh
устанавливается для оболочки входа в систему:(
tcsh
также есть переменная,shlvl
которая установлена в число вложенных оболочек, где оболочка входа в систему имеет значение 1.)источник
PS1
не работает для проверки интерактивной оболочки. Он почти всегда устанавливается в интерактивном режиме, но вы можете отключить его. Это очень часто устанавливает в неинтерактивной оболочке, так как многие системы корабля сexport PS
в/etc/profile
.Другой способ - проверить результат
tty
источник
[ -t 0 ]
для проверки, является ли STDIN tty. Вы также можете использовать 1 (STDOUT) или 2 (STDERR) в зависимости от ваших потребностей.disown
живым,tty
лучше всего было знать, что она больше не интерактивна, но$-
не изменилась; Я все еще озадачен тем, что является лучшим подходом.[ -t 0 ]
. PS В своем предыдущем комментарии я написал, что «существует сильная корреляция» - я забыл «кроме очень распространенного случая сценария, начинающегося с#!/bin/sh
или тому подобного», который не является интерактивным, но может быть подключен к терминалу.UNIX / Linux имеет команду, чтобы проверить, если вы находитесь на терминале.
источник
dash
также.Вы можете проверить, является ли stdin терминалом:
источник
Чтобы проверить, выполняется ли сценарий в интерактивной или неинтерактивной оболочке, я проверяю в своих сценариях наличие приглашения, хранящегося в
$PS1
переменной:Об этом я узнал здесь: https://www.tldp.org/LDP/abs/html/intandnonint.html
источник
i
не правильный вариант для поиска.-i
заставить неинтерактивную оболочку стать интерактивной. Правильная опция автоматического включения есть-s
, но, к сожалению, Bash не справляется с этим правильно.Вам нужно проверить,
$-
содержит лиs
(это разрешено для автоматической активации) или содержит ли онi
(это не разрешено для автоматической активации, но официально подключено только к параметру-i
командной строки оболочки).источник
s
было бы, если оболочка читает команды из стандартного ввода, а не является ли он интерактивным. Интерактивная оболочка не обязательно читает команды из stdin (попробуйтеzsh -i < /dev/null
, хотя zsh кажется здесь исключением). И оболочка может читать команды из stdin и не быть интерактивной (какsh < file
илиecho 'echo "$1"' | sh -s foo bar
).[[...]]
подразумевает ksh / bash / zsh. У вас есть пункт как история записка , что проверкаi
ин$-
не будет работать в оболочке Bourne. Но тогда проверка наs
надежность там тоже не сработает. Вы хотели бы также проверить[ -t 0 ]
илиi
; даже тогда это было бы одурачено в угловых случаях, таких какecho 'exec < /dev/tty; that-check' | sh'