Как проверить, является ли оболочка логиной /интерактивной /пакетной

Я думаю, что понимаю различия между интерактивным, логином и пакетной оболочкой. Для получения дополнительной справки см. Следующие ссылки:

Мой вопрос в том, как я могу проверить с помощью команды /условия, если я нахожусь в интерактивном режиме, логин или пакетная оболочка?

Я ищу команду или условие (которое возвращает true или false)) и что я могу также разместить в инструкции if. Например:

if [[ condition ]]
   echo "This is a login shell"
fi
114 голосов | спросил Amelio Vazquez-Reina 13 TueEurope/Moscow2011-12-13T05:31:18+04:00Europe/Moscow12bEurope/MoscowTue, 13 Dec 2011 05:31:18 +0400 2011, 05:31:18

10 ответов


123

Я предполагаю оболочку bash или аналогичную, поскольку в тегах нет оболочки.

Чтобы проверить, находитесь ли вы в интерактивной оболочке:

[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'

Чтобы проверить, находитесь ли вы в оболочке входа:

shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'

Под «пакетом», я предполагаю, что вы имеете в виду «не интерактивный», поэтому проверка на интерактивную оболочку должна быть достаточной.

ответил Chris Down 14 WedEurope/Moscow2011-12-14T03:19:09+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 03:19:09 +0400 2011, 03:19:09
26

В любой оболочке типа Bourne параметр i указывает, является ли оболочка интерактивной:

case $- in
  *i*) echo "This shell is interactive";;
  *) echo "This is a script";;
esac

Нет портативного и полностью надежного способа проверки оболочки входа. Ksh и zsh добавьте l в $-. Bash устанавливает параметр login_shell, который вы можете запросить с помощью shopt -q login_shell. В переносимости проверьте, запускается ли $0 с -: shells, как правило, знают, что они являются командами входа, потому что вызывающий пользователь добавил префикс - к аргументу нуль (обычно это имя или путь к исполняемому файлу). Это не позволяет обнаружить оболочки, специфичные для вызова оболочки входа (например, ash -l).

ответил Gilles 14 WedEurope/Moscow2011-12-14T15:12:10+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 15:12:10 +0400 2011, 15:12:10
22

рыбная оболочка

Вот ответ на fish, если другие пользователи наткнутся на эту страницу.

if status --is-interactive
    # ...
end

if status --is-login
    # ...
end

echo "darn, I really wanted to have to use globs or at least a case statement"

Рыбная документация: инициализация

ответил ohspite 20 AM00000090000001031 2015, 09:05:10
15

csh /tcsh

Для csh и tcsh У меня есть следующий файл .cshrc:

if($?prompt) then               # Only interactive shells set $prompt
    ...
endif

В частности, для tcsh переменная loginsh установлена ​​для оболочки входа:

if($?loginsh) then              # A login shell..
    ...
endif

(tcsh) также имеет переменную shlvl, которая установлена ​​на количество вложенных оболочек, где оболочка входа имеет значение 1.)

ответил Andrew Stein 13 TueEurope/Moscow2011-12-13T07:25:47+04:00Europe/Moscow12bEurope/MoscowTue, 13 Dec 2011 07:25:47 +0400 2011, 07:25:47
13

Другой способ - проверить результат tty

if [ "`tty`" != "not a tty" ]; then
ответил Adrian Cornish 13 TueEurope/Moscow2011-12-13T08:30:02+04:00Europe/Moscow12bEurope/MoscowTue, 13 Dec 2011 08:30:02 +0400 2011, 08:30:02
6

Вы можете проверить, доступен ли stdin:

if [ -t 0 ]
then
echo "Hit enter"
read ans
fi
ответил Angelo 19 Jam1000000amTue, 19 Jan 2016 04:25:11 +030016 2016, 04:25:11
4

В UNIX /Linux есть команда, чтобы проверить, находитесь ли вы на терминале.

if tty -s
then
echo Terminal
else
echo Not on a terminal
fi
ответил Paul 6 Jpm1000000pmWed, 06 Jan 2016 16:34:44 +030016 2016, 16:34:44
1

Взгляните на команду shopt (по крайней мере, для Bash). Это может определенно сказать вам, если вы находитесь в оболочке входа. Я не знаю об интерактивной /пакетной версии.

Ссылка: http://www.linuxquestions.org/questions/programming-9/how-to-check-in-a-script-whether-the-shell-is-login -или-нон-Логин-360629 /

Посмотрите на страницу пользователя Bash для получения дополнительной информации: http://linux.die.net/человек /1 /Баш

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

ответил jwd 13 TueEurope/Moscow2011-12-13T05:52:49+04:00Europe/Moscow12bEurope/MoscowTue, 13 Dec 2011 05:52:49 +0400 2011, 05:52:49
0

i - неправильный вариант поиска. -i означает принудительное неинтерактивная оболочка, чтобы стать интерактивной. Правильная автоматическая активация опция -s, но Bash, к сожалению, не справляется с этим правильно.

Вам нужно проверить, содержит ли $- s (это предоставляется автоматически активируется) или содержит ли он i (это не предоставляется быть автоматически активированным, но официально только связанным с командной строкой -i вариант оболочки).

ответил schily 25 J0000006Europe/Moscow 2015, 12:43:14
0

Чтобы проверить, работает ли скрипт в интерактивной или неинтерактивной оболочке, Я проверяю свои сценарии на наличие приглашения, хранящегося в переменной $PS1:

if [ -z $PS1 ] # no prompt?
### if [ -v PS1 ]   # On Bash 4.2+ ...
then
  # non-interactive
  ...
else
  # interactive
  ...
fi

Это я узнал здесь: https://www.tldp.org/LDP /ABS /HTML /intandnonint.html

ответил Christian Herenz 15 MarpmThu, 15 Mar 2018 22:50:52 +03002018-03-15T22:50:52+03:0010 2018, 22:50:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132