Bash가 실행 중인 tty를 얻는 방법은 무엇입니까?

Bash가 실행 중인 tty를 얻는 방법은 무엇입니까?

두 번째 접근 방식에서 제안된이 페이지, 다음 명령을 사용하여 bash를 실행하는 tty를 가져올 수 있습니다.

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

나는 스스로 생각했는데, 이것은 실제로 약간 게으른 일입니다. 실행 중인 프로세스 중 하나를 추출하기 위해 모든 실행 프로세스를 나열하는 것입니다. 이렇게 하는 것이 더 효율적이지 않습니까? (이것이 원치 않는 영향을 미칠 수도 있는지 묻고 싶습니다):

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

참고로, 때때로 첫 번째 명령이 실제로 두 개(또는 그 이상) 줄을 생성하기 때문에 이 문제가 발생했습니다. $$이는 다른 프로세스가 실행 중이고 해당 PID에 하위 문자열이 포함되어 있을 때 무작위로 발생합니다. 두 번째 접근 방식에서는 내가 원하는 PID를 요청하여 이를 방지합니다.

답변1

다음을 입력하세요 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 }'

(제정신 변종)

답변2

더 효율적이기를 원한다면, 그렇습니다. ps문제가 있는 프로세스를 필터링하는 것이 가능합니다(그리고 이름에 프로세스 번호가 포함된 명령을 선택하는 위험을 감수하는 것보다 더 정확할 것입니다). 그뿐만 아니라 헤더(옵션 h)를 생성하지 않도록 지시하여 해당 프로세스를 제거 하고 필드(옵션 ) tail만 표시하여 프로세스를 제거하도록 지시할 수 있습니다 .TTYo ttyawk

따라서 다음은 단순화된 명령입니다.

ps hotty $$

답변3

다른 방법:

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 $$

답변4

대화형 셸에서는 w명령을 사용하여 이를 달성할 수 있습니다. 아래 예에서는 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

관련 정보