現在の端末名を取得するには?

現在の端末名を取得するには?

現在の端末名を取得するには?

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です。コマンドプロンプトで新しい複数行ファイルを簡単に作成するために使用できます。入力できる新しい空行にカーソルを置き、もう一度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_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これは現在の端末デバイスのデフォルト名に拡張されます。

注:マンバッシュ

関連情報