실행중인 터미널을 에코하는 포인트는 무엇입니까?

실행중인 터미널을 에코하는 포인트는 무엇입니까?

나는 느린 접근 방식을 사용했습니다.

$ ps | grep bash | grep -oP '/[0-9]+' | grep -oP '[0-9]+'

동일한 작업을 수행하는 더 좋은 방법은 무엇입니까?

답변1

음, 간단하게 다음을 발행할 수 있습니다:

tty

예:

$ tty
/dev/pts/0

만약 너라면오직터미널 번호를 얻으려면 다음을 수행하십시오.

$ tty | grep -Po '\d+$'
0

에서 man tty:

이름
       tty - 연결된 터미널의 파일 이름을 인쇄합니다.
       표준 입력

답변2

이 솔루션의 장점은 빈 문자열을 출력하고 TTY가 다음 형식이 아닌 경우 실패를 반환한다는 것입니다 /dev/pts/###.

tty | grep -Po '(?<=^/dev/pts/)\d+$'

답변3

ps -o tty= -p "$$"

당신을 위한제어 터미널(지정되지 않은 형식이지만 내가 아는 구현에서는 접두사가 없는 장치 경로입니다 /dev/.) pid가 있는 프로세스는 $$셸을 실행하는 프로세스입니다. ps그 자체는 해당 프로세스의 하위 프로세스이거나 해당 프로세스의 하위 프로세스가 되며 동일한 세션에 있으므로 동일한 제어 tty를 갖습니다.

이는 tty가 를 가리키는 것과 동일합니다 /dev/tty.

세션이 tty를 제어하지 않는 경우(일반적으로 쉘이 터미널에서 시작되지 않았지만 일부 데몬에 의해 시작되어 cron섀도우에서 실행되는 경우) ?쉘을 실행하는 프로세스가 종료되면 아무것도 얻지 못합니다. 산출.

tty명령은 stdin(있는 경우)에서 열린 tty 장치의 경로와 다음과 같은 내용을 인쇄합니다.tty 아님그렇지 않으면 오류가 발생합니다.

그래서:

controlling_tty=$(ps -o tty= -p "$$")
case $controlling_tty in
  ('?') echo>&2 'No controlling tty'; exit 1;;
  ('') echo>&2 'Cannot determine the controlling tty'; exit 1;;
  (*) controlling_tty=/dev/$controlling_tty;;
esac
printf '%s\n' "The controlling tty is $controlling_tty"

또는

if ! tty_on_stdin=$(tty); then
  echo>&2 'No tty on stdin or cannot determine which it is'
  exit 1
fi
printf '%s\n' "The tty on stdin is $tty_on_stdin"

대부분의 실제 상황에서 $controlling_terminal$tty_on_stdin는 동일하지만 반드시 그런 것은 아닙니다.

사용 사례에 따라 둘 중 하나를 선호할 수도 있습니다. 예를 들어, 이를 사용하여 tty입력이 어느 터미널에서 왔는지 알아낼 수 있습니다. 어떤 터미널 프레스가 SIGINT를 보내는지 ps확인하고 , 출력이 어느 터미널로 가는지 확인하여 오류를 찾으세요.^Ctty<&1tty<&2

당신이 사용할 수있는:

tty=$(tty) || { tty=$(tty<&3); } 3<&1 || tty=$(tty<&2)

stdin, stdout 또는 stderr에서 tty를 찾고 $tty.

이것은 zsh의 특수 변수에 포함된 것입니다 . 단, 세 개의 파일 설명자 중 어느 것도 tty에 도달하지 않은 경우 제어 터미널이 있으면 제어 터미널을 $TTY얻고 , 그렇지 않으면 빈 문자열(대신 )을 얻습니다./dev/ttynot a tty

아무튼 이건 그럴 수도 있고 아닐 수도 있어요가짜터미널 장비. 의사 단말 장치의 경로 모양은 시스템 및 버전에 따라 다르며 등이 될 수 /dev/pts/somenumber있습니다 /dev/ptyx.

관련 정보