インフラエンジニアというわけではないのですがAWS好きなのでLinuxを基礎から学びなおしている猫だくさんです。
甥にプログラムはいいぞといい続けてついにパソコン買わせることに成功しました。(いくらかお金は出しました)
これでネトゲ廃人になったりしたらギャグなのですが、鬱陶しいおじさんと思われない程度にWeb開発の楽しさを伝えて行こうと思います。
完全に余談でした。
今回はLinuxで何らかの出力する際に使うことが多いリダイレクトについて学んでいきたいと思います。
前回のあらすじ
前回はfileコマンドについて学びました。
https://terralien.net/tech/linux_file/
Linuxにおけるリダイレクトとは
Linuxのコンソール画面でコマンドを打った場合結果はコンソール上に標準出力・もしくは標準エラー出力されます。
それらの結果をファイルに転送(リダイレクト)することを言います。
他にはファイルからコマンドに対して標準入力を送るなど様々なリダイレクト方法がありますが、今回はechoコマンドの使い方を学びます。
echoコマンドについて
コマンドの後に指定した文字をコンソール上に標準出力するコマンドです。
リダイレクトもうちょい詳しく
ここからは実際にコマンドをうってみるのですが、仮想環境としてEnvaderを使用しています。
普通にechoコマンドを打つとコンソール上に標準出力されます。
echo hello work
# 標準出力
hello work
これだと文字を表示させただけに過ぎないので、ファイルに保存したい際に>記号などを使います。
echo hello work > hello.txt
cat hello.txt
hello work
他の使い方
>>でつなぐことで追記できます。
echo say hello world >> hello.txt
cat hello.txt
hello work
say hello world
使うのは主に上記の2つですが、この他に以下があります。
| 記号 | 説明 |
|---|---|
| < | 標準入力へのリダイレクト |
| << | 入力終端文字指定 |
| 2> | 標準エラー出力をファイルに出力 |
| 2>&1 | 標準出力・標準エラー出力をファイルに出力 |
|(パイプ)について
もうひとつよく使う|記号について役割を学びます。
これはコマンドとコマンドをつなぐ際に使用する記号です。
コマンド1の標準出力をパイプでつなぐとコマンド2の標準入力とすることができます。
コマンド1 | コマンド2
|(パイプ)の使い方
$ ps aux | grep nginx
root 1037 0.0 0.1 141124 1488 ? Ss 2021 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 1041 0.0 0.2 143944 2808 ? S 2021 0:11 nginx: worker process
prostudy 5347 0.0 0.1 15888 1076 pts/3 S+ 21:06 0:00 grep --color=auto nginx
こちらの出力内容も>や>>でファイルにリダイレクトすることができます。
引用:【Linuxコマンド】echo、パイプの使い方について
【2026-08-15 追記】表の「2>&1」だけでは、ファイルに出ません
ここから下は2026年8月のterralienが後から足した追記です。当時の本文は直していません。リダイレクトの表の最終行が説明として足りておらず、書いてあるとおりに打つと期待した動きにならないのでそこを埋めます。
訂正: 2>&1は「ファイルに出力」する記号ではありません
本文の表は「2>&1 / 標準出力・標準エラー出力をファイルに出力」としていますが、2>&1単体にファイルへ書く力はありません。これは「エラー出力(2番)の行き先を、いま標準出力(1番)が向いている先と同じにする」という意味だけを持ちます。ファイルに落とすには、別途> ファイルが要ります。
command 2>&1 # 画面に両方出るだけ。ファイルはできない
command > log.txt 2>&1 # ← 両方をlog.txtに入れる正しい書き方
command &> log.txt # bash/zshならこの短縮形でも同じ
そして順番を逆にすると動きません
ここが2>&1のいちばんの罠です。リダイレクトは書いた順に左から処理されるので、入れ替えると結果が変わります。
| 書き方 | 何が起きるか |
|---|---|
command > log.txt 2>&1 |
正しい。 ①1番をlog.txtに向ける ②2番を「1番と同じ先」=log.txtに向ける |
command 2>&1 > log.txt |
エラーが画面に残る。 ①2番を「1番と同じ先」=まだ画面に向ける ②その後で1番だけlog.txtに移る |
後者はcronやログ収集でよく踏みます。ログファイルには正常出力だけが溜まり、肝心のエラーメッセージがどこにも残っていないという形で効いてくるので、うまく動いているように見えるぶん厄介です。
覚え方としては、2>&1は「1番のコピーを取る」であって「1番に付いていく」ではない、と考えると順番の意味が通ります。先に1番の行き先を決めてからコピーを取らないと、古い行き先をコピーしてしまう、というだけの話です。
ついでに: 表の<<はヒアドキュメントです
本文の表は「<< 入力終端文字指定」としていて間違ってはいないのですが、これだけだと何に使うか分かりません。指定した終端文字が出てくるまでの複数行を、そのままコマンドの標準入力に流し込む書き方です。
cat << EOF > setup.txt
1行目
2行目
EOF
設定ファイルをスクリプトの中で書き出すときによく使います。似たものに<<<(ヒアストリング)があり、こちらは1行だけを渡します。
grep nginx <<< "$output"
【2026-08-15 追記ぶんの出典】bash(1) - Linux manual page(REDIRECTION の節。左から順に処理されること、&>・ヒアドキュメント・ヒアストリングの定義)
学んだこと
- 出力結果をファイルに保存する方法を学びました。
- |(パイプ)が出力と入力をつなぐということを学びました。
次回は標準入出力を詳しく学んでいきます。
あ、犬とか猫はそのへんで転がってます。

参考資料
