ハッピーメモメモ

私的備忘録

【シェルスクリプト】リダイレクト

リダイレクトってどんなこと?

<たとえばなし>

 データ = わたしたち1人1人の人間

 コマンド = 列車

 リダイレクト = レール(切り替え操作)

 パイプライン = 乗り換え

 

・旅行をするとき

  人間は列車に乗って目的地で降りる。

  列車(コマンドの中身)は途中で変わらない。

   …飛行機や船に変身したりしない。

 

・乗り換えをするとき

  人間が列車に乗ってB地点で降りる。

  次にB地点でバスに乗り換えて目的地で降りる。

   例)コマンドA  |  コマンドB

     (列車)     (バス)

    入力  出力   入力  出力

   (乗車)(降車) (乗車)(降車)

  

→リダイレクトは、レールのポイント切り替えによって、

 入力先、出力先をどう切り替えるのか、という感じ。

 

コマンド

〇入出力の切り替え

・標準入力の切り替え

  コマンド 0< 入力元 (0は省略可能)

・標準出力の切り替え

  コマンド 1> 出力先 (1は省略可能)

標準エラー出力の切り替え

  コマンド 2> 出力先

☆上書きの場合は上記のように、追記の場合は「<<」「>>」のように記号を重ねてかく。

 

 

〇標準出力先と標準エラー出力をまとめる

・標準出力と標準エラー出力を分けてリダイレクト

  コマンド >標準出力先 2>標準エラー出力

・標準出力先に、標準出力と標準エラー出力をリダイレクト

  コマンド >標準出力先 2>&1

  (&1…標準出力先のコピー)

標準エラー出力先に、標準出力と標準エラー出力をリダイレクト

  コマンド >標準エラー出力先 1>&2

  (&2…標準エラー出力先のコピー)

  用途:echo エラーメッセージ 1>&2

     echoコマンドでエラーメッセージを出力

・標準出力と標準エラー出力を同じファイルにリダイレクト

  コマンド &> (↑の省略型記述)

  →1>,2>両方指定したことになる。

  

リダイレクトの欠点

〇問題点

・リダイレクト以降にsudoは及ばない!!

$ sudo コマンド   > ホームディレクトリ以外の場所にあるファイル

 |←sudo が及ぶ範→ |  

 

〇解決

・teeコマンドを利用

標準出力と標準エラー出力をディスプレイ表示させると同時に、標準出力先・標準エラー出力先を別途指定できる。

「tee -a コマンド」

 

・teeコマンドの由来

  データの流れ方がアルファベットの「T」のようだから。

  ーーーーー>標準出力

     |

     |

      ∨

    ディスプレイ

 

atmarkit.itmedia.co.jp

 

〇おまけ

・findコマンド

ファイルやディレクトリを検索する

使い方:$ find ファイル名

 

・xargs コマンド

ファイル名の一覧を標準入力から受け取って、そのファイル一覧を任意のコマンドに引数として渡す

例)$ find . -name "*.txt" | xargs rm

カレントディレクトリより下にある、拡張子が「.txt」のファイル名を標準出力→|→標準入力

 

ワンライナー

1行でどれだけの作業ができるコードがかけるか、というお遊び