現在の端末名を取得するには?
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です。コマンドプロンプトで新しい複数行ファイルを簡単に作成するために使用できます。入力できる新しい空行にカーソルを置き、もう一度Enterを押して2行目を入力するなどの操作を実行し、control-dを実行するとcpコマンドが終了します。複数行ファイル)。
答え3
返信:「このコマンドが何であるか、何をしているのか、そしてこのコマンドで何ができるかを簡単に説明できますか?と、はるかに良い答えになりそうです。 -Bobby」
または私たちは本当に狂ったように、「より多くの情報を見るためにソースコードをチェックしてください」と言うことができます。だから私はそうでした。
実際に名前を調べるtty.c
、アクセシビリティttyname
召喚されてくださいSTDIN_FILENO
。どちらもunistd.h
(証明のために実行)で定義されており、これは次のように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
これは現在の端末デバイスのデフォルト名に拡張されます。
注:マンバッシュ