현재 터미널 이름을 얻는 방법은 무엇입니까?
ps
TTY 열에 표시된 이름을 의미합니다. 예를 들면 다음과 같습니다.
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
, 지금은 운이 좋지 않습니다. 나는 그것이 무엇을 하는지 정말로 모른다.
그러나 나는 stat
이 fd 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_light
current
get_current
static __always_inline struct task_struct *get_current(void)
{
return this_cpu_read_stable(current_task);
}
어쨌든, 현재 작업과 관련된 목록을 보유하고 있는 유형의 항목이 task_struct
있습니다 . 이것은 배열이며 배열에 대한 인덱스입니다. 모든 것을 마무리하려면 이 배열에 대한 참조가 실제로 무엇을 의미하는지(즉, 작업이 생성될 때 실제로 거기에 배치되는 것이 무엇인지) 알아내면 됩니다 . 그런 다음 해당 배열이 정확하게 반영되었는지 소스 코드에서 확인 하면 우리가 생각하는 일이 실제로 일어나고 있는지 확인할 수 있습니다.files
files_struct
files
fd
fd 0
/proc/self
답변4
@P
연산자를 사용한 쉘 매개변수 확장 도 있습니다 . $PS1
터미널 장치는 유사한 규칙에 따라 얻을 수 있습니다 .
$myvar='\l'
echo ${myvar@P}
\l
이는 현재 터미널 장치의 기본 이름으로 확장됩니다 .
참고 : 맨 배쉬