InfraAcademy

InfraAcademy Blog

Linuxのコマンドラインで使う>(大なり記号)の意味とは?リダイレクト演算子の使い方について解説

| #Linux #Linux初心者 #コマンド
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

こんにちは、フルスタックエンジニアのryuです。

今回の記事では、Linuxのコマンドラインで使う>の意味について解説します。

Linuxの>は、コマンドの実行結果を画面ではなくファイルへ書き込むためのリダイレクト演算子です。

>>>の違いがわからない、エラーメッセージだけを保存したい、画面に表示しながらログにも残したいという方も多いのではないでしょうか。

この記事では、標準出力と標準エラーの基礎から、2>2>&1/dev/nullteeまで、実際のコマンドを使って解説します。

Linuxのコマンドラインで使う「>」の意味とは?

Linuxのコマンドラインで使う>は、コマンドの出力先を変更する記号です。

通常は画面へ表示される内容をファイルへ保存したいときに使用します。

「>」はリダイレクト演算子

大なり記号(>)は、リダイレクト演算子です。出力されたものをファイルに保存します。

例えば、lsコマンドを実行します。

ls

lsコマンドは、ファイルの一覧を表示するものです。コマンドを実行すると、カレントディレクトリ配下のディレクトリ情報が出力されます。

この出力された内容をファイルに保存するものがリダイレクト演算子の>(大なり記号)です。

以下のように実行すると、lsコマンドの出力結果をtest.txtに保存します。

ls > test.txt

catコマンドで、test.txtファイルの中身を見てみましょう。すると、lsコマンドの実行結果が保存されています。

test.txtファイルは作成されていない場合は、自動で作成されます。

すでにtest.txtファイルがある場合、>(大なり記号)を使用するとファイルの中身が全て上書きされるので注意しましょう。

実務では、ログや設定ファイルを誤って上書きすると復元が難しい場合があります。

重要なファイルを対象にするときは、実行前にls -lcatでファイル名と内容を確認してください。

「>>」でファイルの末尾に追加する

すでにファイルがある場合、>を使用するとファイルの中身が全て上書きされます。

上書きをせずに、既存の内容の末尾へ追加したい場合は>>を使用します。

echo "message add" >> test.txt

もう一度、catコマンドでファイルの中身を確認すると、ファイルの末尾に”message add”という文章が追加されていることがわかります。

Linuxにおける>(大なり記号)の使い方

>>>は、どちらも標準出力をファイルへ送る記号です。

違いは、既存ファイルを上書きするか、末尾へ追記するかです。

記号 動作 ファイルがない場合 ファイルがある場合
> 上書き 新しく作成する 内容を空にして書き込む
>> 追記 新しく作成する 末尾へ追加する

動作の違いは、次のコマンドで確認できます。

echo "first" > sample.txt
echo "second" > sample.txt
cat sample.txt

表示されるのはsecondだけです。

次に、追記してみます。

echo "third" >> sample.txt
cat sample.txt

今度はsecondthirdが残ります。

シェルスクリプトで実行ログを蓄積したい場合は>>、毎回新しい結果へ置き換えたい場合は>というように使い分けましょう。

Linuxの標準入力・標準出力・標準エラー

リダイレクトを理解するには、Linuxコマンドが扱う3つの入出力を知っておく必要があります。

それぞれには、ファイルディスクリプターと呼ばれる番号が割り当てられています。

種類 番号 主な役割
標準入力 0 キーボードやファイルからデータを受け取る
標準出力 1 正常な実行結果を表示する
標準エラー出力 2 エラーや診断メッセージを表示する

>の前に番号を省略した場合は、標準出力の1が対象です。

そのため、次の2つは基本的に同じ意味になります。

ls > list.txt
ls 1> list.txt

標準入力や標準出力の仕組みは、次の記事でも詳しく解説しています。

【関連記事】Linuxの標準入力・標準出力・標準エラーを解説

Linuxにおける「>」の使い方

ここからは、リダイレクトの具体的な使用例を紹介します。

単純なファイル作成だけでなく、正常な結果とエラーを分けて保存する方法も確認しましょう。

使用例1.ファイルを作成する

まず、>はファイルの作成時に使われます。

例えば、ファイルの中身に文字を入れたい場合、echoコマンドと組み合わせて使用します。

echo "hoge hoge" > test.txt

ファイルの中身をcatコマンドで確認すると、”hoge hoge”という文字がファイルの中身に書かれています。

使用例2.コマンドの出力結果をファイルに保存

次は、コマンドの実行結果をファイルへ保存します。

ls -l > list.txt

ファイル一覧を後から確認したり、別の人へ共有したりするときに便利です。

日時も一緒に保存する場合は、複数のコマンドをまとめられます。

{
  date
  ls -l
} > report.txt

波括弧の中にある両方の標準出力がreport.txtへ保存されます。

使用例3.エラーだけを保存する

存在しないディレクトリをlsすると、エラーメッセージが標準エラー出力へ送られます。

ls /not-found

エラーだけをファイルへ保存する場合は、ファイルディスクリプター2を指定します。

ls /not-found 2> error.log

標準出力は通常どおり画面へ表示され、標準エラーだけがerror.logへ保存されます。

追記したい場合は2>>を使います。

./my-script 2>> error.log

使用例4.正常な結果とエラーを別々に保存する

正常な結果とエラーを分けたい場合は、2つのリダイレクトを組み合わせます。

./my-script > output.log 2> error.log

この例では、標準出力がoutput.log、標準エラーがerror.logへ保存されます。

バックアップやバッチ処理の結果を調査するときに、正常ログとエラーログを分けておくと原因を確認しやすくなります。

標準出力と標準エラーを同じファイルへ保存する

コマンドのすべてのメッセージを1つのログへ保存したい場合は、標準エラーを標準出力と同じ出力先へ向けます。

Bashでは、次のように記述します。

./my-script > all.log 2>&1

「2>&1」の意味

2>&1は、ファイルディスクリプター2を、現在のファイルディスクリプター1と同じ出力先へ複製するという意味です。

先に> all.logで標準出力をファイルへ向け、その後で標準エラーも同じ場所へ向けています。

> all.log   標準出力をall.logへ送る
2>&1        標準エラーを現在の標準出力と同じ場所へ送る

Bashでは、次の短い記法も利用できます。

./my-script &> all.log

ただし、&>はBash固有の書き方です。

ほかのPOSIX系シェルでも動かしたいスクリプトでは、> all.log 2>&1の方が意図を伝えやすいでしょう。

リダイレクトは左から順番に処理される

次の2つは、同じ動作ではありません。

./my-script > all.log 2>&1
./my-script 2>&1 > all.log

1つ目は、標準出力と標準エラーの両方をall.logへ保存します。

2つ目は、最初に標準エラーをその時点の標準出力、つまり画面へ向け、その後で標準出力だけをファイルへ変更します。

そのため、記号の順番にも意味があることを覚えておきましょう。

出力を捨てる「/dev/null」

不要な出力を画面にもファイルにも残したくない場合は、/dev/nullへリダイレクトします。

/dev/nullへ書き込まれた内容は破棄されます。

標準出力を非表示にする

正常な結果だけを捨てる場合は、次のように実行します。

command > /dev/null

標準エラーは画面へ表示されるため、失敗したことには気づけます。

すべての出力を非表示にする

標準出力と標準エラーの両方を捨てる場合は、次のように実行します。

command > /dev/null 2>&1

定期実行するコマンドで使われることがありますが、エラーまで見えなくなります。

原因調査が難しくなるため、最初からすべて捨てるのではなく、必要に応じてログへ保存する方法を選びましょう。

画面に表示しながら保存するteeコマンド

>を使うと、標準出力はファイルへ送られるため、通常は画面へ表示されません。

画面で確認しながらファイルにも保存したい場合は、teeコマンドを使います。

ls -l | tee list.txt

teeは標準入力を受け取り、標準出力へ表示しながらファイルへも書き込みます。

teeで末尾へ追記する

teeは通常、対象ファイルを上書きします。

末尾へ追加したい場合は-aオプションを使います。

ls -l | tee -a list.txt

管理者権限が必要なファイルへ書き込む

次のコマンドは、一般ユーザーでは失敗することがあります。

sudo echo "設定" > /etc/example.conf

sudoが適用されるのはechoだけで、リダイレクトを処理するシェルは一般ユーザーのままだからです。

この場合は、teeを管理者権限で実行します。

echo "設定" | sudo tee /etc/example.conf

既存ファイルへ追記する場合はsudo tee -aを使います。

設定ファイルを上書きする前には、バックアップを作成し、内容を十分に確認してください。

ファイルを標準入力として渡す「<」

リダイレクトには、出力先を変更する>だけでなく、入力元を変更する<もあります。

たとえば、sortへファイルの内容を標準入力として渡す場合は、次のように実行します。

sort < names.txt

並べ替えた結果を別のファイルへ保存するなら、入力と出力のリダイレクトを組み合わせます。

sort < names.txt > sorted.txt

cat names.txt | sortでも似た結果になりますが、<を理解すると、コマンドがどこから入力を受け取っているのかを考えやすくなります。

リダイレクトでよくある失敗

リダイレクトは便利ですが、書き方を間違えるとファイルを消したり、必要なエラーを見落としたりします。

ここでは、初心者が特に注意したい失敗を整理します。

誤って重要なファイルを空にする

次のようにコマンドを付けず、リダイレクトだけを実行すると、ファイルが空になります。

> important.log

ログを空にする目的で使われることもありますが、意図せず実行すると内容は失われます。

ファイル名を変数で指定するシェルスクリプトでは、変数が正しいか確認してからリダイレクトしてください。

標準エラーが保存されていない

次のコマンドで保存されるのは標準出力だけです。

./my-script > result.log

実行に失敗しても、エラーメッセージは画面にしか表示されません。

自動処理の調査用ログなら、標準エラーを別ファイルへ保存するか、2>&1でまとめて保存します。

Linuxのリダイレクト演算子まとめ

今回の記事では、Linuxの>とリダイレクト演算子について解説しました。

代表的な書き方を一覧で確認しましょう。

書き方 意味
command > file 標準出力を上書き保存
command >> file 標準出力を追記
command 2> file 標準エラーを上書き保存
command 2>> file 標準エラーを追記
command > file 2>&1 標準出力と標準エラーを同じファイルへ保存
command > /dev/null 2>&1 すべての出力を破棄
command | tee file 画面に表示しながら保存
command < file ファイルを標準入力として渡す

まずは>>>の違いを覚え、次に2>2>&1を練習すると理解しやすくなります。

Linuxの基本コマンドをまとめて学びたい方は、次の記事も参考にしてください。

【関連記事】初心者が最初に覚えたいLinuxコマンド40選

Linuxの学習を始めたい方はこちらから

「Linuxの実践的な内容を学習したい」、「コマンドを打ちながらLinuxを学習したい」

そのようなご要望にお応えして、Linuxやネットワークが学習できるサイト「InfraAcademy」をリリースしました!

入門から中級まで初心者でもわかりやすく学習を進めることができます。

↓InfraAcademyの講座の一部です。

上記以外にも、DNSサーバーの構築方法や、Dockerの設定方法などさまざまな講座があります。

インフラエンジニアに必要な知識が学習できます。

InfraAcademyで学習をはじめる

参考資料

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る