Это - 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])
Я принимаю a bash
оболочка, или подобный, с тех пор нет никакой оболочки, перечисленной в тегах.
[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'
shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'
"Пакетом" я предполагаю, что Вы имеете в виду "не интерактивный", таким образом, проверка на интерактивную оболочку должна быть достаточной.
В любой оболочке стиля Границы, 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
).
$0
всегда запускается с a -
неважно, как это было запущено. Но существует по крайней мере одно исключение: Это не всегда верно с ударом, даже если он, как предполагается, оболочка входа в систему. Попробуйте его в своем поле: вызвать bash --login
, затем $0
все еще чтения bash
.
– Wirawan Purwanto
16.10.2015, 23:35
Для csh
и tcsh
У меня есть следующее в моем .cshrc
файл:
if($?prompt) then # Only interactive shells set $prompt
...
endif
Специально для tcsh
, переменная loginsh
установлен для оболочки входа в систему:
if($?loginsh) then # A login shell..
...
endif
(tcsh
также имеет переменную shlvl
который установлен на количество вложенных оболочек, где оболочка входа в систему имеет значение 1.)
PS1
не работает для тестирования на интерактивную оболочку. Это почти всегда устанавливается в интерактивном, но можно сбросить его. Это очень часто устанавливается в неинтерактивной оболочке, потому что много систем поставлются с export PS
в /etc/profile
.
– Gilles 'SO- stop being evil'
14.12.2011, 13:35
Иначе должен проверить результат tty
if [ "`tty`" != "not a tty" ]; then
[ -t 0 ]
протестировать, если STDIN является tty. Можно также использовать 1 (STDOUT) или 2 (STDERR) в зависимости от потребностей.
– derobert
14.12.2011, 01:17
disown
и живой, tty
работавший лучше всего для знания это больше не является интерактивным, в то время как $-
не изменился; я все еще озадачен о том, что является лучшим подходом.
– Aquarius Power
25.07.2014, 09:14
[ -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
i
- не тот вариант, который нужно искать. -i
заставляет иначе.
неинтерактивная оболочка, чтобы стать интерактивной. Правильное автоматическое включение
опция -s
, но Баш, к сожалению, не справляется с этим правильно.
Нужно проверить, содержит ли -
-
(предоставляется в виде
автоматическая активация) или содержит ли она
i
(это не относится к
быть автоматически активированным, но официально связанным только с командной строкой -i
.
вариант оболочки).
Вот ответ для рыбы
на случай, если другие пользователи наткнутся на эту страницу.
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"
В UNIX / Linux есть команда для проверки того, находитесь ли вы на терминале.
if tty -s
then
echo Terminal
else
echo Not on a terminal
fi
Чтобы проверить, выполняется ли скрипт в интерактивной или -неинтерактивной оболочке, Я проверяю в своих скриптах наличие подсказки, хранящейся в переменной $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
Любопытно, что сценарии, запускаемые с рабочего стола в MacOS, имеют ту же среду, что и сценарии, запускаемые вручную. (У них есть свой stdin как телетайп tty, их login_shell
shopt отключен и их "$-"
asehxB
)
Если мой предпочтительный способ вывести скрипт на рабочий стол — это создать символическую ссылку из ~/Desktop
на скрипт, я могу только догадываться, что он был запущен щелчком, проверив, является ли "$0"
абсолютным путем (т.е. начинается с косой черты ).
для ЗШ
# 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 :Что такое оболочка входа в систему? Простые тесты
zsh
пользователи, проверяющие на оболочку входа в систему, могут быть, покончите:if [[ -o login ]] ...
– chb 27.06.2013, 08:05$-
расширяется в текущей оболочке. При использовании одинарных кавычек вокруг полного выражения, Вы получите корректный результат:bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
– Chris Down 01.06.2016, 18:58