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

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

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

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

4970閲覧

UNIXシェルにおける、/dev/ttyや/dev/nullへの出力処理の結果に関して

AnchorBlues

総合スコア18

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2018/03/31 06:27

UNIXシェルにおいて、

$ ls

$ ls > /dev/tty

は同じ結果になると思います。

ところが、

$ ls >& /dev/null

$ (ls > /dev/tty) >& /dev/null

は同じ結果になりません。
(前者は何も表示されないが、後者は通常のlsの結果と同じになる)

これはどうしてなのでしょうか。
どなたかご教授いただければと思います。

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

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

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

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

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

otn

2018/03/31 06:35

何故同じになると思ったのでしょうか?誤解の理由が分かりません。
AnchorBlues

2018/03/31 07:45

$ (ls > /dev/tty) >& /dev/null において、(ls > /dev/tty)がまず評価されて、その結果が/dev/nullに渡されると思っておりました。
guest

回答3

0

/dev/tty 、/dev/null が何を意味するのか、ぐぐってみたらどうでしょうか

投稿2018/03/31 07:18

y_waiwai

総合スコア87784

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

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

AnchorBlues

2018/03/31 07:48

すみません、記事のタイトルが不適切でした。 自分が理解したかったのは、 /dev/tty, /dev/null に関する挙動・知識というよりもむしろ シェルコマンドにおいて括弧を用いたときの処理のされ方についてでした。 つまり、 $ (history > /dev/tty) > a.txt とした時に、historyの結果がa.txtでなくて標準出力に出力される理由について理解したいと思っておりました。
y_waiwai

2018/03/31 08:12

それじゃttyは標準出力ということは理解してるというわけですよね? なら、(history > /dev/tty) という時点で、標準出力に出力されないと仮定する理由を説明してくださいますか?
AnchorBlues

2018/03/31 09:18

例えば $ history > /dev/tty > a.txt だと、標準出力に何も出力されず、a.txtに出力されますよね? 括弧をつけるとどうして標準出力に出力されるのか、ということです。 (解決いたしましたので、コメントは不要です)
guest

0

ベストアンサー

シェルはリダイレクトを処理してからコマンドを実行します。
まず、">& /dev/null"で、"(ls > /dev/tty)"コマンドの標準出力と標準エラー出力が"/dev/null"にリダイレクトされてから、コマンドが実行されます。
次に、"> /dev/tty"で、lsコマンドの標準出力("/dev/null"にリダイレクト済み)が"/dev/tty"にリダイレクトされてから、コマンドが実行されます。
よって、lsコマンドの出力は、"/dev/tty"に出力されます。

投稿2018/03/31 07:06

編集2018/03/31 07:29
hichon

総合スコア5737

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

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

AnchorBlues

2018/03/31 09:18

理解いたしました。 ありがとうございました。
guest

0

()はサブシェルの起動を意味します。

(ls > /dev/tty) >& /dev/null

は、

sh -c " ls > /dev/tty" >& /dev/null ```とだいたい同じ。 つまりシェルを起動してシェルの標準出力と標準エラーを束ねて/dev/nullに入れる、そのシェルには「lsの標準出力をファイルに仕舞う」させる、という処理になります。 ls>/dev/ttyだと標準出力は/dev/ttyに向いていますが (ls>/dev/tty)だと、 lsの出力は/dev/ttyにリダイレクトされているが lsを起動するサブシェルの標準出力(何も出てはきませんが)はそのまま残ってるので、リダイレクトできます。 あと、ちょっと気になったのですが、bashのマニュアルを読むと >& file と&> file は同じ意味だが >& のほうが望ましい、とありました。

投稿2018/04/02 01:22

a_saitoh

総合スコア702

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問