bash가 실행중인 tty를 얻는 방법?


24

이 페이지 에서 제안한 두 번째 방법 에서 bash가 다음 명령으로 실행되는 tty를 얻습니다.

ps ax | grep $$ | awk '{ print $2 }'

나는 확실히 이것이 조금 게으 르며, 실행중인 모든 프로세스를 나열하여 그중 하나를 추출합니다. 더 효율적이지 않을까요 (원치 않는 효과가 있는지 묻습니다) :

ps -p $$ | tail -n 1 | awk '{ print $2 }'

참고로, 때로는 첫 번째 명령이 실제로 두 개 이상의 줄을 생성하기 때문에이 문제를 겪었습니다. $$하위 문자열로 포함 된 PID로 실행중인 다른 프로세스가있을 때 무작위로 발생 합니다. 두 번째 접근법에서는 원하는 PID를 요청하여 이러한 경우를 피하고 있습니다.


6
가장 효율적인 방법은 ttybash 세션 내 에서 명령을 실행하는 것 입니다. 당신은 사용을 주장하는 경우 ps-ps -p $$ -o tty=
iruvar

답변:


46

간단히 입력하여 tty:

$ tty 
/dev/pts/20

너무 간단하고 사실입니다 :)

편집 : 첫 번째 pty프로세스는 실행중인 프로세스 중 프로세스를 반환합니다 grep.

$ ps ax | grep $$
28295 pts/20   Ss     0:00 /bin/bash
29786 pts/20   S+     0:00 grep --color=auto 28295

따라서 하나의 결과 만 얻으려면 grep을 필터링해야합니다.

ps ax | grep $$ | grep -v grep | awk '{ print $2 }'

또는 사용

ps ax | grep "^$$" | awk '{ print $2 }'

(더 깔끔한 변형)


예, 이것이 실제로 제안 된 첫 번째 해결책입니다 (실제로입니다 tty | sed -e "s:/dev/::"). 그러나 그 페이지에서 제안 된 두 번째 해결책은 비효율적 일뿐 만 아니라 잘못이라고 생각합니다! tty그래도 불만을 사용 하고 중단합니다. :)
Sheljohn

첫 번째 pty프로세스는 실행중인 프로세스 grep도 알 수 있습니다.
Jakuje

2
grep사용하는 경우 필요하지 않습니다 awk. 예를 들어 ps ax | awk "/^$$/ {print \$2}", 작은 따옴표 대신 이스케이프 된 큰 따옴표를 사용하십시오 \$2. 그러나 당신이 말하는 것처럼 사용하는 tty것이 올바른 해결책입니다.
cas

이와 같이 grepping하면 PID가 10이고 PID 103도있는 경우와 같이 잘못된 일치가 발생할 수 있습니다. 사용awk -vpid=$$ '$1 == pid {print $2}'
Barmar

나는 여기서 ttynode.js에서 스폰 하는 것이 전혀 작동하지 않는 반면 ps친구 는 잘 작동 한다는 것을 지적 합니다.
Steven Lu

17

더 효율적이기를 원한다면 ps문제의 프로세스로 필터링 할 수있는 것이 맞습니다 (그리고 프로세스 번호를 이름으로 사용하는 명령을 선택하지 않아도 더 정확합니다) ). 뿐만 아니라 헤더 (option h) 를 생성하지 않고 tail프로세스를 제거 하지 않고 TTY필드 (option o tty) 만 표시 하여 프로세스를 제거 하도록 지시 할 수 있습니다 awk.

다음은 축소 된 명령입니다.

ps hotty $$

10

다른 방법 :

readlink /dev/fd/0     #or 1 or 2 
readlink /proc/self/fd/0 #or 1 or 2
readlink -f /dev/stdin #or stdout or stderr; f to resolve recursively
#etc.

(stdin, stdout 및 stderr이 제어 터미널에 연결되어 있지 않은 쉘에 있다면 다음을 열어 제어 터미널에 파일 설명자를 가져올 수 있습니다 /dev/tty.

( { readlink /dev/fd/0; } </dev/tty; ) </dev/null  >output 2>&1

)

또는과 ps:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$

2
(1) 프로세스의 현재 / 제어 tty는 파일 설명자와 관련이 없으며 fd에서 열려 있다고 보장되지 않습니다. 그러나 해당 우발 사태에 대한 임시 해결책으로 제공 한 명령을 시도 했습니까? 내가 시도 할 때 /dev/tty제어 tty가 아닌 모든을 얻는다 ps. (2) 나는 그것이 { readlink /dev/fd/0; } < /dev/tty동등 readlink /dev/fd/0 < /dev/tty하다고 생각한다. 그렇다면 정당화 할 수 있습니까? (3) 명령의 두 번째 세미콜론 (다음에 나오는 /dev/tty)은 필요하지 않습니다.
Scott

6

완전성을 위해 언급 된 다른 ps 명령은 Linux에서 작동하지만 ps -p $$ -o tty=(@ 1_CR에서 언급 한 바와 같이) Unix Standard에 정의 된 옵션 만 사용하므로 모든 최신 Unix 시스템에 가장 이식성이 뛰어납니다 .


2

대화식 쉘에서 w명령을 사용할 수 있습니다 . bellow 예제에서는 w특정 사용자가 자체적으로 보고서를 실행하며 물론 해당 명령이 실행되는 위치에 TTY가 표시됩니다.

$ w
 11:20:08 up 5 min,  3 users,  load average: 0.34, 0.39, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
xieerqi  :0       :0               11:15   ?xdm?   1:47   0.34s init --user
xieerqi  pts/0    :0               11:18   23.00s  0.05s  0.05s /bin/mksh
xieerqi  pts/10   :0               11:20    0.00s  0.03s  0.01s w
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.