ベストアンサー1
シェルの子プロセスとして、ls
シェルのオープンファイル記述子を継承します。標準ファイル記述子(stdin、stdout、stderr(または0、1、2))は擬似端末に接続され、端末エミュレータによって処理されます。
たとえば(Linuxシステムの場合):
$ ls /proc/$$/fd -l
total 0
lrwx------ 1 muru muru 64 Dec 10 16:15 0 -> /dev/pts/3
lrwx------ 1 muru muru 64 Dec 10 16:15 1 -> /dev/pts/3
lrwx------ 1 muru muru 64 Dec 10 16:15 2 -> /dev/pts/3
lrwx------ 1 muru muru 64 Dec 10 16:15 255 -> /dev/pts/3
$ ls /proc/$(pgrep terminator -f)/fd -l | grep pts/3
lrwx------ 1 muru muru 64 Dec 10 16:15 26 -> /dev/pts/3
つまり、 の出力ls
またはシェル自体はシェルで処理されず、端末エミュレータ (GNOME 端末、ターミネータ、xterm など) で処理されます。
これをテストできます。
pts
Linuxでは、GNOME端末などの端末エミュレータで使用される擬似端末()を見つけます。
$ ls -l /proc/$(pgrep -n gnome-terminal)/fd | grep pts
lrwx------ 1 muru muru 64 Dec 10 18:00 1 -> /dev/pts/1
lrwx------ 1 muru muru 64 Dec 10 18:00 15 -> /dev/pts/20
lrwx------ 1 muru muru 64 Dec 10 18:00 2 -> /dev/pts/1
これで、非標準fd(0、1、2以外のfd)を使用してgnome-terminal
シェルに入出力を提供します。端末エミュレータは、このPTSに送信されたデータを読み取り、画面に表示します(色など一部の処理)。この場合は15
に接続してくださいpts/20
。これまで何かを書くと、この端末に表示されると予想できます。
追加資料:
別の場合に私がすることは次のとおりです。
echo $(ls)
a=$(date)
vim `command -v some_script`
~と呼ばれるコマンドの置き換え。コマンドの置き換えでは、コマンドの出力はシェル自体によってキャプチャされ、印刷しない限り(たとえばecho $(ls)
)端末に到達しません。イベントは以下で処理されました。ホクラキンの答え。