В сценарии оболочки:
if [ -t 0 ]; then
echo stdin is a terminal
fi
В a perl
сценарий:
print "stdin is a terminal\n" if -t;
В C:
if (isatty(0)) puts("stdin is a terminal");
Они все делают то же, сделайте tty определенное ioctl
и возвратите true если ioctl
сбои с ошибкой ENOTTY. В моей системе, ioctl
TCGETS, и я полагаю, что это довольно распространено, поскольку это - очевидное.
$ : | strace -e ioctl su
ioctl(0, TCGETS, 0x7ffff32dfc50) = -1 ENOTTY (Inappropriate ioctl for device)
su: must be run from a terminal
Да, последние версии Bash могут сделать это:
$ pwd
/home/terdon
$ line="I'm in /home/terdon"
$ [[ "$line" =~ "$PWD"$ ]] && echo yes
yes
Тот же синтаксис работает в ZSH и KSH, но не в тире. Насколько я знаю, Dash не имеет таких возможностей.
Обратите внимание, что ваше Regeex проверяет, заканчивается ли переменная $ Line
с $ PWD
. Чтобы проверить, соответствует ли $ PWD
в любой точке $ LINE
, удалить $
:
$ line="I'm in /home/terdon, are you?"
$ [[ "$line" =~ "$PWD" ]] && echo yes
yes
В любой POSIX-совместимой оболочке вы можете сделать:
case $line in (*"$PWD"*)
# whatever your then block had
;;esac
Это работает в bash
, dash
, и практически в любой другой оболочке, которую вы можете назвать.
Его также можно использовать для простой обработки нескольких возможностей. Например:
case $line in
(*"$PWD"*)
echo \$PWD match\!
;;
(*"$OLDPWD"*)
echo \$OLDPWD match\!
;;
(*)
! echo no match\!
;;esac
Вы также можете использовать чередование:
case $line in (*"$PWD"*|*"$OLDPWD"*)
echo '$OLDPWD|$PWD match!'
;;esac
Обратите внимание на использование кавычек выше:
case $line ...
case
не будет разделен ни на $IFS
, ни использован в качестве шаблона для gen имен файлов. Это аналогично тому, как обрабатывается левый аргумент в тесте [[
. (*"$PWD "*)
$IFS
, ни генерации имен файлов - расширение без кавычек не будет ни разбивать, ни глобализировать. $PWD
содержит *
и не заключена в кавычки, то она будет истолкована как объект шаблона, а не как буквальное *
для поиска.