Проблема с большинством приведенных выше ответов заключается в том, что мы можем быть в subshell присоединенного сеанса экрана. Или мы можем открыть оболочку для удаленного хоста из сеанса экрана. В первом случае мы можем просмотреть происхождение дерева процессов и сопоставить имя программы screen
. В последнем случае большую часть времени мы можем проверить переменную TERM
на что-то вроде screen*
.
Мой ответ похож на / u / Parthian-Shot, но не очень зависит от утилиты pstree; варианты, которые он использует, мне недоступны. С другой стороны, моя реализация все еще зависит от Linux: для не-Linux систем необходимо настроить команду ps
; для систем со старыми оболочками, которые не поддерживают массивы, у вас будет еще больше обходных путей. Но все равно:
ps_walk_parents() {
local tmp
local ppid=$PPID
while [[ $ppid != 1 ]]; do
tmp=($( ps -o ppid,comm -p $ppid ))
ppid=${tmp[0]} # grab parent pid
echo ${tmp[1]} # output corresponding command name
done
}
if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then
# we are in a screen terminal
fi
Мы могли бы немного оптимизировать нашу функцию, чтобы прекратить поиск, если / когда родитель процесса совпадает с именем целевой команды («screen»), но в общем случае функция будет выполнять только 2–3 итерации. Предположительно, вы хотите поместить этот код в некоторую инициализацию запуска, такую как .bashrc или .profile или что-то еще, так что, опять же, не стоит оптимизировать.