두 번째 접근 방식에서 제안된이 페이지, 다음 명령을 사용하여 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
만 표시하여 프로세스를 제거하도록 지시할 수 있습니다 .TTY
o tty
awk
따라서 다음은 단순화된 명령입니다.
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