распечатать все терминалы пользователя кроме текущего - PullRequest
2 голосов
/ 05 февраля 2020

Я пытаюсь распечатать все терминалы пользователя, кроме текущего терминала, используемого для этой проверки. Для получения текущего терминала я использую команду tty, которая отлично работает, если используется отдельно. Однако, когда в сочетании с awk, это терпит неудачу.

Почему сбой команды ниже?

 -->ls -l /dev/pts/  |grep ${USER} |awk -v current_tty=$(tty) '{n=split(current_tty,a,"/")} $0 !~ a[n] {print $0}'
awk: fatal: cannot open file `tty' for reading (No such file or directory)

Однако, когда я заменяю $(tty) на $(echo /dev/pts/44), тогда эта же команда работает.

 -->tty
/dev/pts/44

 -->ls -l /dev/pts/  |grep ${USER} |awk -v current_tty=$(echo /dev/pts/44) '{n=split(current_tty,a,"/")} $0 !~ a[n] {print $0}' 
crw--w---- 1 monk tty  136, 15 Feb  5 10:16 15
crw--w---- 1 monk tty  136, 19 Feb  5 10:16 19
crw--w---- 1 monk tty  136, 28 Feb  5 10:16 28
crw--w---- 1 monk tty  136, 35 Feb  5 10:22 35
crw--w---- 1 monk tty  136, 39 Feb  5 10:18 39
crw--w---- 1 monk tty  136, 43 Feb  5 10:18 43
crw------- 1 monk tty  136, 46 Feb  5 10:16 46
crw--w---- 1 monk tty  136, 48 Feb  5 10:16 48
crw--w---- 1 monk tty  136,  8 Feb  5 10:16 8

Я выполнил $(tty) только его работающий

 -->echo $(tty)
/dev/pts/44

Попробовал альтернативный подход, который привел к тому же результату:

ps -eaf |awk -v USER=${USER} -v current_terminal=$(tty) '$1==USER && $6 != "?"'

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Не могли бы вы попробовать следующее.

ps -eaf |\
awk -v user=${USER} -v term_pid=$$ '$1==user && $3 != term_pid && $2!=term_pid && $6 != "?"'

Объяснение приведенного выше кода: Я использовал $$ средство оболочки для получения идентификатора текущего сеанса, затем в условиях awk я проверяю, что для 2-го и 3-го полей оба значения не должны быть равны значению $$. Помещая условие 2-го и 3-го полей, оно также удалит дочерние идентификаторы текущей оболочки.

1 голос
/ 05 февраля 2020
find /dev/pts -mindepth 1 -maxdepth 1 \
    -type c \
    -user "$USER" \
  ! -path "$(tty)" \
    -print

То есть мы находим:

  • Прямые потомки /dev/pts
  • ... которые являются символьными устройствами (как и все PTY должны быть ) ...
  • ... и которые принадлежат текущему пользователю ...
  • ... и которые не текущий tty.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...