Проблема з більшістю із зазначених вище відповідей є те , що ми могли б бути в субоболочке з приєднаною сесії екрану. Або ми можемо відкривати оболонку для віддаленого хоста з сеансу екрану. У першому випадку ми можемо переглядати батьківське дерево процесу та відповідати 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]}
echo ${tmp[1]}
done
}
if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then
fi
Ми могли б трохи оптимізувати нашу функцію, щоб зупинити пошук, якщо / коли батьківський процес відповідає імені цільової команди ("екран"), але загалом, функція буде вражати лише 2-3 ітерації. Імовірно, ви хочете помістити цей код в якусь ініціалізацію запуску, таку як .bashrc або .profile чи щось інше, тому знову ж таки, не варто оптимізувати.
screen -r
, він повідомить вас, що ви знаходитесь на екрані (або, якщо екранів немає, це повідомляє вам, що ви не можете бути на одному), і якщо ви перебуваючи не на екрані, і прив’язавшись до нього, ви можете просто набратиC-a
(або будь- яка інша клавіша на екрані) +,d
щоб вийти з екрану, який ви щойно ввели. Отже, це один простий спосіб сказати. Однак не варто давати відповідь, оскільки я припускаю, що OP вже знав / відхилив цей варіант.