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

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

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

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

Q&A

解決済

2回答

2779閲覧

ファイルディスクリプタの基本的な質問

haya-linux

総合スコア23

bash

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

0グッド

1クリップ

投稿2016/12/01 16:18

###前提・実現したいこと
ファイルディスクリプタの基本的な使い方がわかっていません。
ネットと本で調べました。
以下の5パターンのシェルの振る舞いについて教えてください。
よろしくおねがいします

環境
Linux Mint 18 Sarah

Client: Shell (bash 4.3.421)

###該当のソースコード

~/shell-test $ exec 3>aaa

(1)
~/shell-test $ echo 123 0>&3
123
aaaに書き込まれない

(2)
~/shell-test $ echo 123 >&3
表示なし

(3)
~/shell-test $ echo 123 3>&0
123
aaaに書き込まれる

(4)
~/shell-test $ echo 123 3<&0
123
aaaに書き込まれる

(5)
~/shell-test $ echo 123 0<&3
123
aaaに書き込まれない

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

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

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

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

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

guest

回答2

0

fd3への出力はファイルaaaに書き込む $ exec 3>aaa fd0(stdin)をfd3にリダイレクト。コマンドの結果はfd1(stdout)に出力される。 $ echo 123 0>&3 123 fd1(stdout)をfd3にリダイレクト。つまりファイルaaaに書き込まれる。 $ echo 123 >&3 このコマンドは $ echo 123 1>&3 と等価です。 fd3(file:aaa)の出力をfd0(stdin)にリダイレクト。(意味なし) $ echo 123 3>&0 fd0(stdin)をfd3(file:aaa)にリダイレクト。(意味なし) $ echo 123 3<&0 fd3(file:aaa)をfd0(stdin)にリダイレクト。(意味なし) $ echo 123 0<&3 ※echoはfd0:stdinを受付けないので、代わりにcatで引数なしに変えてみるとわかります。

投稿2016/12/02 03:45

moonphase

総合スコア6621

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

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

haya-linux

2016/12/02 07:56

moonphaseさん。レスありがとうございました。 ただ、(3),(4),(5)の問題は解決していません。問題はShellの種類なのでしょうか? 再び書き直しましす。monophaseさんは(意味なし)と書かれていますが、 私の環境だと、”表示され、かつファイルに書かれたり、書かれなかったり” します。できればcatを使った例もお教えください。 ~/shell-test $ exec 3>aaa (3) ~/shell-test $ echo 123 3>&0 を実行すると 123と表示され、かつ123が aaaに書き込まれる (4) ~/shell-test $ echo 123 3<&0 実行すると 123と表示され、かつ123が aaaに書き込まれる (5) ~/shell-test $ echo 123 0<&3 実行すると 123と表示されるが、123は aaaに書き込まれない
moonphase

2016/12/02 23:24

$ echo HELLO > aaa $ exec 3<aaa $ cat 0<&3 HELLO $ cat 0<&3 (no output)
guest

0

ベストアンサー

そもそも、echoコマンドは、「引数をファイルディスクリプタ1に出力する」というコマンドなので、
・入力のリダイレクト
・1以外のディスクリプタへの出力のリダイレクト
は、意味無しです。

(2)のみリダイレクトに意味があります。
その他は、リダイレクト無しのecho 123と同じ効果です。

投稿2016/12/02 04:51

otn

総合スコア84499

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

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

haya-linux

2016/12/02 10:16

レスありがとうございました。 ”・1以外のディスクリプタへの出力のリダイレクト は、意味無しです。 ” は分かりました。 それではどうして、(3),(4)の場合に"123"という文字が aaaに書き込まれるのでしょうか? それと >&0 <&0 >0 を使ったシェルの簡単な例をおしえてくださらないでしょうか?
otn

2016/12/02 16:32

> それではどうして、(3),(4)の場合に"123"という文字がaaaに書き込まれるのでしょうか? 「書き込まれている」というのがあなたの勘違いです。書きこまれません。 > >&0 <&0 >0 を使ったシェルの簡単な例をおしえてくださらないでしょうか? >&0 ディスクリプタ0は、普通は入力用なので出力にリダイレクトには使いません。 <&0 は、0<&0 ということで、「ディスクリプタ0をディスクリプタ0にリダイレクトする」となり、無意味です。 >0 は、"0"という名前のファイルへのディスクリプタ1の出力リダイレクトです。
haya-linux

2016/12/03 09:37

otnさん 貴重なアドバイスありがとうございました。 ほぼ理解できました。 (3),(4)に関しては、私の勘違いでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問