현재 터미널 이름을 얻는 방법은 무엇입니까?

현재 터미널 이름을 얻는 방법은 무엇입니까?

현재 터미널 이름을 얻는 방법은 무엇입니까?

psTTY 열에 표시된 이름을 의미합니다. 예를 들면 다음과 같습니다.

root@dor-desktop:/home/dor/Documents/LAMP_setup/webs_install/do/install# ps aux | egrep 'mysql|(^USER)'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dor       2238  0.2  1.9 448052 79796 ?        S    17:27   0:17 gedit /home/dor/Documents/LAMP_setup/webs_install/do/install/mysql.install /home/dor/Documents/LAMP_setup/webs_install/do/install/mysql.setup
root      4975  0.1  0.5 324984 22876 ?        S    18:12   0:04 gedit /usr/local/mysql/bin/mysqld_safe
root      8160  0.0  0.0   4108   664 pts/2    S    19:08   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --skip-networking --skip-grant-tables --user=mysql --basedir=/usr/local/mysql --ledir=/usr/local/mysql/libexec
mysql     8279  0.0  0.4 146552 19032 pts/2    Sl   19:08   0:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --user=mysql --skip-networking --skip-grant-tables --log-error=/usr/local/mysql/var/dor-desktop.err --pid-file=/usr/local/mysql/var/dor-desktop.pid --socket=/usr/local/mysql/mysql.sock --port=3306
root      8342  0.0  0.0   7632  1024 pts/2    R+   19:14   0:00 egrep --color=auto mysql|(^USER)

pts/2위의 예에서는 이러한 명령을 실행하고 있을 수 있는 현재 터미널의 이름을 가져와야 합니다 .

답변1

tty

이제 30자를 입력해야 하는데 3자면 충분합니다... :-)

답변2

답장: "이 명령이 무엇인지, 무엇을 하는지, 그리고 이 명령으로 무엇을 할 수 있는지 간략하게 설명해 주실 수 있나요? 와, 훨씬 더 좋은 답변이 될 것 같습니다. -Bobby"

터미널(또는 옛날 사람들이 가끔 부르는 콘솔)의 현재 Unix 이름은 /dev/tty 이며, 명령 프롬프트에서 새 여러 줄 파일을 쉽게 만드는 데 사용할 수 있습니다: cp /dev /tty README.md (클릭한 다음 텍스트를 입력할 수 있는 새 빈 줄에 커서를 놓고 Enter를 다시 누르고 두 번째 줄을 입력하는 등의 작업을 수행합니다. 줄을 입력한 후 control-d를 실행하면 cp 명령이 종료됩니다. 단일 명령을 사용하는 여러 줄 파일).

답변3

답장: "이 명령이 무엇인지, 무엇을 하는지, 그리고 이 명령으로 무엇을 할 수 있는지 간략하게 설명해 주실 수 있나요? 와, 훨씬 더 좋은 답변이 될 것 같습니다. -Bobby"

또는우리는 정말 미친 듯이 "더 많은 정보를 보려면 소스 코드를 확인하세요"라고 말할 수 있습니다. 그래서 나는 그랬다.

실제로 이름을 알아내다tty.c, 접근성ttyname소환되세요 STDIN_FILENO. 둘 다 unistd.h(증명을 위해 run)에 정의되어 있으며 , 이는 다음 을 통해 grep "STDIN_FILENO\|ttyname" /usr/include/unistd.h가져옵니다.tty.c#include "system.h"(가다여기확인하다 system.h).

이제 ttyname정의된 외부 종속성은glib_c/sysdeps/posix/ttyname.c. 그러면 fstats파일 설명자 STDIN_FILENO( )를 가져와서 0다음 함수를 사용합니다.gettyname실제로 tty 이름에 대한 포인터를 검색합니다. fstat결국 이어지는INLINE_SYSCALL존재하다fxstat.c, 드디어 전화해internal_syscall2, 지금은 운이 좋지 않습니다. 나는 그것이 무엇을 하는지 정말로 모른다.

그러나 나는 statfd 0모든 작업을 수행하고 "stdin"이나 이와 유사한 것으로 끝나지 않도록 하는 . 어느 쪽이든 다음을 보면 동일한 동작을 얻을 수 있습니다.

stat /dev/stdin # -> /proc/self/fd/0
stat /proc/self/fd/0 # -> /dev/pts/<some number>

그렇다면 /dev/pts/<some number>그것은 당신 것입니다 tty.

고쳐 쓰다

나는 모든 것의 근본 원인을 파악하려고 노력하고 있지만 위와 같이 자세히 설명하지는 않겠습니다. 지금까지 나는 syscall간접 참조가 호출된 함수에서 끝나고 vfs_fstat즉시 호출되는 함수를 호출하는 것으로 추론했습니다. 이는 여기에 정의된 결과를 반환하는 매크로를 사용합니다.fdget_raw__fget_lightcurrentget_current

static __always_inline struct task_struct *get_current(void)
{                                                           
    return this_cpu_read_stable(current_task);              
}                                                           

어쨌든, 현재 작업과 관련된 목록을 보유하고 있는 유형의 항목이 task_struct있습니다 . 이것은 배열이며 배열에 대한 인덱스입니다. 모든 것을 마무리하려면 이 배열에 대한 참조가 실제로 무엇을 의미하는지(즉, 작업이 생성될 때 실제로 거기에 배치되는 것이 무엇인지) 알아내면 됩니다 . 그런 다음 해당 배열이 정확하게 반영되었는지 소스 코드에서 확인 하면 우리가 생각하는 일이 실제로 일어나고 있는지 확인할 수 있습니다.filesfiles_structfilesfdfd 0/proc/self

답변4

@P연산자를 사용한 쉘 매개변수 확장 도 있습니다 . $PS1터미널 장치는 유사한 규칙에 따라 얻을 수 있습니다 .

$myvar='\l'
echo ${myvar@P}

\l이는 현재 터미널 장치의 기본 이름으로 확장됩니다 .

참고 : 맨 배쉬

관련 정보