Как сказать, работает ли терминальный сеанс в экране

Программа, названная xmodmap, может использоваться для изменения контурных карт. Посмотрите man xmodmap если это уже установлено.

Короче говоря используйте xev видеть детали приблизительно X событий. Разожгите это и ударьте Ваш / ключ. На моей установке это - результат, который я получаю:

KeyRelease event, serial 34, synthetic NO, window 0x4e00001,
root 0x15a, subw 0x0, time 107752919, (784,828), root:(789,850),
state 0x10, keycode 61 (keysym 0x2f, slash), same_screen YES,
XLookupString gives 1 bytes: (2f) "/"
XFilterEvent returns: False

Затем на удаленной машине использовать xmodmap -e 'keycode [KEYCODE] = [KEYSYM] создать отображение, где [КОД КЛАВИШИ] и [KEYSYM] значения, полученные от xev. Попытайтесь установить значение по умолчанию 61,0x2f сначала, чтобы видеть, должно ли оно просто быть сброшено. (т.е. xmodmap -e 'keycode 61 = 0x2f')

Если это - остановка, попытайтесь отобразить другой ключ. Например, я попробовал код клавиши 105 (правильное управление) к 0x2f. Это работало локально и на ssh сессии для меня.

Править:

Можно также хотеть установить вопросительный знак. Расширьте предыдущую команду до xmodmap -e 'keycode 61 = 0x2f 0x3f'. Вы видите полный список keysyms здесь.

9
23.05.2017, 15:40
3 ответа

Как правило, $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 передается через rlogin, rsh, telnet, ssh. Это, как как гарантируют, не будет работать вышеупомянутым, но более просто и менее навязчиво.

case $TERM in
  (screen*) echo "I'm more than likely running in screen"
esac

Как для предыдущего решения, можно работать в screen, но Вы не можете давать команды к нему с screen -X например. Однако обратите внимание на то, что можно передать команды с помощью escape-последовательностей (хотя это не включено по умолчанию из соображений безопасности).

10
27.01.2020, 20:05

При выполнении на экране Вашего $TERM переменная среды изменяется на экран. Можно зарегистрироваться в сценарии, например,

if [[ "$TERM" == screen* ]]; then
  echo "Running in screen"
else 
  echo "Outside screen"
fi 

Это было бы одним из подходов. echo $TERM вне экрана и снова echo $TERM в экране и посмотрите различие

4
27.01.2020, 20:05

Я использую tmux сам и это немного для списка сессий, только если я уже не нахожусь на tmux сессии

if [ -z "$TMUX" ]; then
    alias tmuxa='tmux attach -d -t'
    alias tmuxc='tmux new-session -s'
    echo "You're not in a tmux session, create a new one with tmuxc, or attach to one of the ones below with tmuxa"
    tmux ls
fi
1
27.01.2020, 20:05

Теги

Похожие вопросы