【シェルスクリプト】リダイレクト
リダイレクトってどんなこと?
<たとえばなし>
データ = わたしたち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」のようだから。
ーーーーー>標準出力
|
|
∨
ディスプレイ
〇おまけ
・findコマンド
ファイルやディレクトリを検索する
使い方:$ find ファイル名
・xargs コマンド
ファイル名の一覧を標準入力から受け取って、そのファイル一覧を任意のコマンドに引数として渡す
例)$ find . -name "*.txt" | xargs rm
カレントディレクトリより下にある、拡張子が「.txt」のファイル名を標準出力→|→標準入力
1行でどれだけの作業ができるコードがかけるか、というお遊び