Как проверить, является ли оболочка входом в систему/интерактивным/пакетом

Это - zsh, так действительно существует спецификатор шарика для этого.

echo *([1,42])         # The first 42 files in the current directory, in lexicographic order
echo **/*([1,42])      # The first 42 files in a depth-first traversal
echo **/*(od[1,42])    # The first 42 files in a breadth-first traversal

Другие спецификаторы, которые могли бы быть полезными, например, следующее выражение, включают точечные файлы (D), ограничивает регулярными файлами (.) и символьные ссылки (-) в регулярные файлы, и расширяется до пустого списка, если там не идет ни в какое сравнение (N):

echo *(-.DN[1,42])

148
13.04.2017, 15:13
11 ответов

Я принимаю a bash оболочка, или подобный, с тех пор нет никакой оболочки, перечисленной в тегах.

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

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

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

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

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

166
27.01.2020, 19:28
  • 1
    Для zsh пользователи, проверяющие на оболочку входа в систему, могут быть, покончите: if [[ -o login ]] ... –  chb 27.06.2013, 08:05
  • 2
    Если Вы хотите знать, запустил ли "пользователь" Вашу программу по сравнению с "кроном". [[НАЗОВИТЕ == "немой"]] && эхо, "Работающее в кроне. –  Erik Aronesty 03.12.2013, 19:49
  • 3
    @ErikAronesty Не все простые терминалы является сессиями крона. –  Chris Down 05.12.2013, 00:11
  • 4
    “ я принимаю оболочку удара, или подобный, так как нет никакой оболочки, перечисленной в тегах”. – Логика этого оператора действительно красива! :) –  Michael Le Barbier Grünewald 14.12.2015, 10:44
  • 5
    @antonio Поэтому Ваше заключение в кавычки является неправильным, $- расширяется в текущей оболочке. При использовании одинарных кавычек вокруг полного выражения, Вы получите корректный результат: bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"' –  Chris Down 01.06.2016, 18:58

В любой оболочке стиля Границы, 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 запускается с a -: оболочки обычно знают, что они - оболочки входа в систему, потому что вызывающая сторона добавила a - префикс к нулю аргумента (обычно имя или путь исполняемого файла). Этому не удается обнаружить особенные методы оболочки вызова оболочки входа в систему (например. ash -l).

36
27.01.2020, 19:28
  • 1
    (...), потому что вызывающая сторона – я думаю, существует что-то отсутствующее в этом фрагменте. –  Piotr Dobrogost 20.07.2015, 15:22
  • 2
    Это было бы идеально если $0 всегда запускается с a - неважно, как это было запущено. Но существует по крайней мере одно исключение: Это не всегда верно с ударом, даже если он, как предполагается, оболочка входа в систему. Попробуйте его в своем поле: вызвать bash --login, затем $0 все еще чтения bash. –  Wirawan Purwanto 16.10.2015, 23:35
  • 3
    @WirawanPurwanto, я не уверен, что понимаю Ваш комментарий. Не это, что я записал в своем последнем предложении? номер –  Gilles 'SO- stop being evil' 18.10.2015, 22:19
  • 4
    @Gilles: Вы корректны. Извините я пропустил Ваше последнее предложение. –  Wirawan Purwanto 20.10.2015, 20:58

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.)

19
27.01.2020, 19:28
  • 1
    PS1 не работает для тестирования на интерактивную оболочку. Это почти всегда устанавливается в интерактивном, но можно сбросить его. Это очень часто устанавливается в неинтерактивной оболочке, потому что много систем поставлются с export PS в /etc/profile. –  Gilles 'SO- stop being evil' 14.12.2011, 13:35
  • 2
    @Gilles Спасибо за исправление и редактирование –  Andrew Stein 14.12.2011, 17:26

Иначе должен проверить результат tty

if [ "`tty`" != "not a tty" ]; then
17
27.01.2020, 19:28
  • 1
    ... или использование [ -t 0 ] протестировать, если STDIN является tty. Можно также использовать 1 (STDOUT) или 2 (STDERR) в зависимости от потребностей. –  derobert 14.12.2011, 01:17
  • 2
    @derobert - благодарит показать мне что-то новое –  Adrian Cornish 14.12.2011, 05:12
  • 3
    Это - другой тест. Возможно иметь неинтерактивную оболочку, вход которой является терминалом (каждый раз, когда Вы запускаете скрипт в терминале!), и возможно (хотя редкий) иметь интерактивный вход взятия оболочки не от терминала. –  Gilles 'SO- stop being evil' 14.12.2011, 13:34
  • 4
    @Gilles, если оболочка была интерактивной, и закрыла отъезд ребенка disown и живой, tty работавший лучше всего для знания это больше не является интерактивным, в то время как $- не изменился; я все еще озадачен о том, что является лучшим подходом. –  Aquarius Power 25.07.2014, 09:14
  • 5
    @AquariusPower Затем, что Вы хотите протестировать, не для интерактивной оболочки, но является ли стандартный вход терминалом. Использовать [ -t 0 ]. P.S. В моем предыдущем комментарии, я записал, что “существует сильная корреляция” — я забыл “кроме чрезвычайно общего падежа сценария, запущенного с #!/bin/sh и т.п.”, который является неинтерактивным, но может быть подключен к терминалу. –  Gilles 'SO- stop being evil' 25.07.2014, 10:55

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

if [ -t 0 ]
then
    echo "Hit enter"
    read ans
fi
8
27.01.2020, 19:28

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

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

2
27.01.2020, 19:28

fish shell

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

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"

Документация Fish: инициализация

24
27.01.2020, 19:28

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

if tty -s
then
echo Terminal
else
echo Not on a terminal
fi
9
27.01.2020, 19:28

Чтобы проверить, выполняется ли скрипт в интерактивной или -неинтерактивной оболочке, Я проверяю в своих скриптах наличие подсказки, хранящейся в переменной $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

3
27.01.2020, 19:28

Любопытно, что сценарии, запускаемые с рабочего стола в MacOS, имеют ту же среду, что и сценарии, запускаемые вручную. (У них есть свой stdin как телетайп tty, их login_shellshopt отключен и их "$-"asehxB)

Если мой предпочтительный способ вывести скрипт на рабочий стол — это создать символическую ссылку из ~/Desktopна скрипт, я могу только догадываться, что он был запущен щелчком, проверив, является ли "$0"абсолютным путем (т.е. начинается с косой черты ).

0
02.07.2020, 18:37

для ЗШ

# Checking Interactive v.s. Non-Interactive
[[ -o interactive ]] && echo "Interactive" || echo "Non-Interactive"
#
# Checking Login v.s. Non-Login
[[ -o login ]] && echo "Login" || echo "Non-Login"

Ссылка:2.1.1 :Что такое оболочка входа в систему? Простые тесты

12
27.07.2020, 10:39

Теги

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