質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

4906閲覧

Linuxのファイルディスクリプタの扱いについて

Divided_by_Zero

総合スコア42

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1グッド

3クリップ

投稿2016/01/26 17:42

Linux初学者です。
プログラミングなども初心者なので、暖かい目で見ていただけると嬉しいです。

Linuxについて勉強している際、以下のような記述を見ました。

bash

1$ exec 9<>/dev/tty <&9 >&9

これはどうやら、execコマンドによってfd9番で端末を開き、標準入出力をこのfd9番と差し替えるという意味のようでした。

私は、端末のfd9番に標準入出力が流れ込むようなイメージをしていたのですが、これは正しいのでしょうか?

また、

bash

1exec 9<>/dev/tty

という部分について、
execは実行する、つまるところexecコマンドを実行したプロセスの子プロセスとして引数のものを実行する、/dev/ttyは端末を表していると解釈したのですが(この解釈が正しいかも少し不安です)、<>という箇所がよくわかりません。
一瞬、SQLなどで見られるような非等価演算子なのか・・・?と思いましたが、ここでは不適切に思えます。
これは一体どういう意味なのでしょうか?

###################################################################

私からの質問をまとめさせて頂きますと、

bash

1exec 9<>/dev/tty <&9 >&9

という記述について
①端末のfd9に標準入出力が流れ込んでいくイメージであっているのか?
②execによって子プロセスとして引数のものを実行する、/dev/ttyは端末である、といった解釈は合っているのか?
③<>という記述は一体どういうことを表しているのか?
となります。

基礎なところでつまづいてしまっていますが、どなたかご教授いただけないでしょうか?

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

①端末のfd9に標準入出力が流れ込んでいくイメージであっているのか?

間違っています。端末にfd9とかはありません。ファイルディスクリプタはあくまでプロセスの物です。

②execによって子プロセスとして引数のものを実行する、

間違っています。リダイレクト記述のみのexecコマンドは、今のプロセス(bash)のファイルディスクリプタのオープン、クローズ、つなぎ替えだけを行います。

/dev/ttyは端末である、

合ってます。/dev/ttyは仮想的なデバイスで、「今まさに使っているこの端末」の事を意味します。
別々の端末で、/dev/ttyはそれぞれ別々の端末を指します。

③<>という記述は一体どういうことを表しているのか?

<>はリダイレクトの記号で、指定したファイル(/dev/tty)を読み書きモードでオープンすると言うことです。
9<>だと、9番ファイルディスクリプタでオープンします。9番がすでにオープンされていればその前にクローズしてからです。

bash

1exec 9<>/dev/tty <&9 >&9

は、「今まさに実行しているbashプロセス」のファイルディスクリプタについて、
(1) 9番がオープンされていればクローズ
(2) 9番で/dev/ttyを読み書きモードでオープン
(3) 0番(標準入力)をクローズ
(4) 9番を0番にコピー(標準入力が/dev/ttyになる)
(5) 1番(標準出力)をクローズ
(6) 9番を1番にコピー(標準出力が/dev/ttyになる)
です。

投稿2016/01/27 13:10

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Divided_by_Zero

2016/01/27 14:45 編集

丁寧な回答ありがとうございます。 後学のために、いくつか質問させて頂けると嬉しいです。 ①<>という表記は、リダイレクトということでなく、<>という表記で指定ファイルを読み書きモードで開くという解釈であっているのでしょうか? ②①に関連した質問ですが、読み書きモードということは、読み込みのみのモード、書き込みのみのモードも似たような表記で表現するのでしょうか?もしあるのでしたら教えていただけると幸いです。 ③質問3の回答について、/dev/ttyを読み書きモードでオープンすると、initが起動し、bashが実行されるのでしょうか? ④自分の環境(Ubuntu 12.04.1 LTS i686)でコマンドを叩いて確認してみました。 hoge@piyo:~$ ps PID TTY TIME CMD 14866 pts/3 00:00:00 bash 14981 pts/3 00:00:00 ps hoge@piyo:~$ ls /proc/14866/fd/ 0 1 2 255 hoge@piyo:~$ exec 9<>/dev/tty <&9 >&9 hoge@piyo:~$ ls /proc/14866/fd/ 0 1 2 255 9 hoge@piyo:~$ pstree init─┬─NetworkManager─┬─dhclient │ ・・・ ├─gnome-terminal─┬─bash            ├─bash───pstree pstreeの出力を見て、 /dev/ttyという、今コマンドを叩き込んでいるこの端末の上で(端末の上でってところでもうすでに理解が曖昧になっちゃってます)initプロセスが動き、その子プロセスであるgnome-terminalの子プロセスであるbash(なぜか2つある?)の子プロセスであるpstreeが動いていると解釈しました(合ってるのかな・・・?)。 pstreeより前に叩いたコマンドの出力を見ると、どうもbashプロセスが新たに9番のファイルディスクリプタを持ったように見えます。 なぜ、<>の引数は/dev/ttyなのにbashプロセスのファイルディスクリプタが増えたのでしょうか?(そう決められているのでしょうか?) ⑤9番を0番にコピー、1番にコピーというのは、標準入力、標準出力が/dev/ttyになるとありますが、0番のファイルディスクリプタを9番につなぐ、あるいは1番のファイルディスクリプタを9番につなぐという動作をしているのでしょうか? 1つの質問の中にいくつか疑問点が出てしまって申し訳ないのですが、可能であれば、ご回答いただけると嬉しいです。
otn

2016/01/28 01:55

> ①<>という表記は、リダイレクトということでなく、<>という表記で指定ファイルを読み書きモードで開くという解釈であっているのでしょうか? <>はリダイレクトの記号だと書いたのですが。読み書き用のリダイレクト記号なので、読み書きでオープンします。 > 読み込みのみのモード、書き込みのみのモードも似たような表記で表現するのでしょうか? 読み込みモードは、< で、書き込みモードは > です。 > ③質問3の回答について、/dev/ttyを読み書きモードでオープンすると、initが起動し、bashが実行されるのでしょうか? initは関係ないです。initはOSの起動時に起動されて、ずっとそのまま居座るプロセスです。 /dev/ttyをオープンしたからと言って、新たに何かプロセスが起動することはないです。 > /dev/ttyという、今コマンドを叩き込んでいるこの端末の上で(端末の上でってところでもうすでに理解が曖昧になっちゃってます)initプロセスが動き、 上に書いた通り、initプロセスは端末とは関係ありません。OS起動時から終了まで居座るプロセスで、全部のプロセスの初代ご先祖様に当たります。 > その子プロセスであるgnome-terminalの子プロセスであるbash(なぜか2つある?)の子プロセスであるpstreeが動いていると解釈しました(合ってるのかな・・・?)。 これは合ってますね。bashが2つあるのはタブが2つ開いているからとか? > pstreeより前に叩いたコマンドの出力を見ると、どうもbashプロセスが新たに9番のファイルディスクリプタを持ったように見えます。 これは合ってます。 > なぜ、<>の引数は/dev/ttyなのにbashプロセスのファイルディスクリプタが増えたのでしょうか?(そう決められているのでしょうか?) bashでbashのファイルディスクリプタに対して、リダイレクトを行ったためです。リダイレクト先が、/dev/ttyというファイルだということ。 > ⑤9番を0番にコピー、1番にコピーというのは、標準入力、標準出力が/dev/ttyになるとありますが、0番のファイルディスクリプタを9番につなぐ、あるいは1番のファイルディスクリプタを9番につなぐという動作をしているのでしょうか? そういう理解で、当たらずとも遠からずです。実際に行われているのは、「つなぐ」でなく「コピー」です。 繋ぐという言葉を使うと、9番に繋ぐのでなく、/dev/ttyのオープン状態に繋ぐ。 この後、もし9番をクローズしても、0番1番は/dev/ttyに繋がったままです。 コピーなので、9番をクローズして9番についての情報が消えても、同じ物が0番、1番に入っている。繋ぐという理解だと、9番をクローズすると、0番1番も使えなくなってしまうイメージを持ちませんか?
Divided_by_Zero

2016/01/28 06:45

① 申し訳ありません。最初にリダイレクトについて習ったときに<と>のみしか習っていなかったので、<>という表記が、<と>が組み合わされて使われているものだと勘違いしてしまっていました・・・ よく調べてみたら、>や<、<>だけでなく>&、<&も全て一つのものなのですね 1文字区切りで見てしまっていたので混乱してしまいました。 ③混乱してしまっていて申し訳ないです そうでした・・・ そういえば、OS起動時にカーネルがする仕事の一つにinitプロセスを立ち上げるというものがありました。 端末を2つ起動していました・・・ 恥ずかしい・・・ ⑤ そうですね・・・ そこまで考えが回ってませんでした・・・ 9番のファイルディスクリプタと同等のものを0番と1番にもコピーしてあげると考えるとすっきりします。 exec 9<> /dev/tty <&9 >&9を実行すると・・・ execコマンドによってファイルディスクリプタのオープン、つなぎかえを行うことをする 今まさに実行しているbashプロセスの ファイルディスクリプタ9番に対し、/dev/ttyを読み書きモードでオープンする。 9番ファイルディスクリプタを0番にコピー 9番ファイルディスクリプタを9番にコピー 私が理解が浅いために長い質問に付き合わせてしまって申し訳ありません・・・ ようやくコマンドが実行されてどういうことが起こっているのかイメージできてきました。 本当にありがとうございます! 当然、ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問