Как правило, $STY
будет установлено.
Так:
if [ -n "$STY" ]; then
echo "I'm most likely running under screen"
fi
$STY
как правило, то, что вам нужно поговорить с вашим screen
. Это используется для построения пути сокета домена Unix, используемого для управления screen
(что-то вроде /var/run/screen/S-$USER/$STY
.
Например, это не сработает, если с этого экрана вы перейдете ssh
на другую машину. Запущенная там оболочка не будет иметь $STY
в своем окружении, и это в любом случае не принесет ей никакой пользы, поскольку она не сможет получить доступ к доменным сокетам Unix на вашей машине.
Однако можно запросить терминал с помощью escape-последовательности, чтобы определить его тип:
if [ -t 1 ] && [ -t 0 ]; then
s=$(stty -g)
stty -icanon -echo min 0 time 3
printf '\033[>c'
type=$(dd count=1 2> /dev/null)
stty "$s"
case $type in
(*'>83;'*) echo "this is screen"
esac
fi
Другой подход, предложенный @ val0x00ff, заключается в проверке значения $TERM
переменной среды. Это значение предназначено для того, чтобы сообщать приложениям, с каким типом терминала они общаются. Он задается screen
чем-то, что начинается с screen
(как screen
можно реализовать различные варианты терминалов). $TERM
передается accross rlogin
, rsh
, telnet
, ssh
. Это не так гарантированно, как описано выше, но проще и менее навязчиво.
case $TERM in
(screen*) echo "I'm more than likely running in screen"
esac
Как и в предыдущем решении, вы можете работать screen
, но, возможно, вы не сможете, например, выдавать ему команды screen -X
. Однако обратите внимание, что вы можете передавать команды, используя escape-последовательности (хотя это не включено по умолчанию из соображений безопасности).
Я использую tmux сам, и это немного, чтобы перечислить сессии, только если я еще не в сессии tmux
источник