このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Linux】特殊なリダイレクト

リダイレクトを用いた出力内容の破棄

 Linux および Unix 系オペレーティングシステムにおけるリダイレクトは、標準入力、標準出力、および標準エラー出力を制御するための強力な機能です。通常のリダイレクト操作に加え、システム管理者やシェルスクリプト作成者が効率的に作業を行うために、いくつかの「特殊なリダイレクト」手法が存在します。

 これらの手法を駆使することで、不要な出力の抑制や複数行にわたる入力の一括処理が可能となり、シェルスクリプトの可読性やメンテナンス性が大幅に向上します。

 特殊なリダイレクトの代表例として、出力内容の破棄を行う方法と、ヒアドキュメントを用いた複数行の文字列入力方法について解説します。

 また、これらの手法がどのように実際のシェルスクリプトやコマンドライン操作に応用されるかについても具体的な例を交えながら説明します。特殊なリダイレクトの理解と活用は、Linux環境での作業効率を飛躍的に高める鍵となります。

/dev/nullファイル

 「/dev/null」は、Linux および他の Unix 系オペレーティングシステムで特別なファイルです。これは、書き込み操作を受け付けるが、どのデータも保存しない「ビットバケット」として機能します。

つまり、ゴミ箱のような役割を持っています。

出力を破棄するために使用されるため、不要なメッセージやエラーメッセージを抑制するためによく使われます。

/dev/null」の使用例

標準出力を破棄したい場合

例えば、コマンドの標準出力を破棄したい場合は次のようにします。

command > /dev/null

標準エラー出力も同様に破棄したい場合

command 2> /dev/null

両方の出力を破棄する場合

command > /dev/null 2>&1

 これにより、「command」の出力(標準出力および標準エラー出力)がすべて破棄され、画面に表示されなくなります。

バックグラウンドで実行しつつ出力を破棄

 このコマンドは、「some_command」をバックグラウンドで実行し、その標準出力および標準エラー出力の両方を破棄します。例えば、長時間かかるプロセスをバックグラウンドで実行し、出力を抑制したい場合に便利です。

some_command > /dev/null 2>&1 &

スクリプト内での使用例

 シェルスクリプト内での具体例を示します。以下のスクリプトは、不要な出力を破棄しながら複数のコマンドを実行します。

#!/bin/bash

echo "スクリプトを開始します..."

# 標準出力を破棄
echo "このメッセージは表示されません" > /dev/null

# 標準エラー出力を破棄
ls non_existent_file 2> /dev/null

# 両方の出力を破棄
some_command > /dev/null 2>&1

echo "スクリプトを終了します..."

リダイレクトを用いた出力内容の破棄の具体例

 具体的なコマンドの例をいくつか示します。これらの例は、不要な出力やエラーメッセージを表示しないようにするために役立ちます。

1.標準出力の破棄

標準出力(通常の出力)を破棄するには、次のようにします。

・「ls > /dev/null」コマンドを実行します。

このコマンドは、ls コマンドの出力を「 /dev/null」にリダイレクトし、画面には何も表示しません。

ls > /dev/null

2.標準エラー出力の破棄

標準エラー出力(エラーメッセージ)を破棄するには、次のようにします。

・「ls non_existent_file 2> /dev/null」コマンドを実行します。

 このコマンドは、存在しないファイルをリストしようとするため、エラーメッセージが出ますが、2> /dev/null によりそのエラーメッセージが破棄されます。

ls non_existent_file 2> /dev/null

3.標準出力と標準エラー出力の両方を破棄

まず、ファイルを1つ作成しておきます。

・「touch existent_file」コマンドを実行します。

user01@ubuntu-vm:~$ touch existent_file

両方の出力(標準出力および標準エラー出力)を破棄するには、次のようにします。

・「ls non_existent_file existent_file > /dev/null 2>&1」コマンドを実行します。

 このコマンドは、標準出力を 「/dev/null」にリダイレクトし、その後標準エラー出力も標準出力と同じ場所(つまり 「/dev/null」)にリダイレクトします。これにより、両方の出力が破棄されます。

※「non_existent_file」は、存在しないファイルで、標準エラー出力を発生させ、「existent_file」は、存在するファイルであり、標準出力を発生させます。

ls non_existent_file existent_file existent_file > /dev/null 2>&1

ヒアドキュメントと呼ばれるリダイレクト

ヒアドキュメントとは

 ヒアドキュメント(Here Document)は、シェルスクリプトで複数行の文字列をコマンドに直接入力する方法です。通常、ヒアドキュメントは「<<」を用いて開始され、指定した終了文字列(通常は「 EOF」 など)が出現するまでのすべての行が入力として扱われます。

ヒアドキュメント使用例

「cat」コマンドでの使用例

例えば、cat コマンドに対してヒアドキュメントを使用する例です。

・「cat << EOF」と入力し、最後に「EOF」と入力します。

user01@ubuntu-vm:~$ cat << EOF
> これはヒアドキュメントの例です。
> この文字列はEOFまでcatコマンドの入力として扱われます。
> EOF

上記のスクリプトを実行すると、次のように出力されます。

これはヒアドキュメントの例です。
この文字列はEOFまでcatコマンドの入力として扱われます。

「cat」コマンドを使って設定ファイルを作成

 設定ファイルを作成する際にもヒアドキュメントは便利です。例えば、「config.txt」というファイルに設定内容を書き込む場合。

cat << EOF > config.txt
[General]
name = MyApp
version = 1.0
EOF

これにより、「config.txt」 ファイルが作成され、指定した内容が書き込まれます。

・「cat config.txt」コマンドを実行します。

user01@ubuntu-vm:~$ cat config.txt
[General]
name = MyApp
version = 1.0

作成したファイルの削除

作成したファイルとリダイレクトによって作成されたファイルを削除します。

・「rm existent_file config.txt」コマンドを実行し、「ls」コマンドで削除されたかどうかを確認します。

user01@ubuntu-vm:~$ rm existent_file config.txt
user01@ubuntu-vm:~$ ls
snap          テンプレート  ドキュメント  ピクチャ      公開
ダウンロード  デスクトップ  ビデオ        ミュージック

EOFの意味

 「EOF」は「End Of File」の略で、ファイルの終端を示す概念です。ヒアドキュメントにおける 「EOF」は、入力の終わりを示すための識別子として使用されます。ヒアドキュメントでは、「EOF」はユーザーが自由に決めることができ、例えば次のように異なる識別子も使用できます。

cat << END
これは別の識別子を使ったヒアドキュメントの例です。
END

 上記の場合、「END」 という文字列がヒアドキュメントの終了を示します。識別子は、他のテキストと混同しないように一意であることが望まれます。

まとめ

 以上が、特殊なリダイレクトに関する解説です。リダイレクトはシェルスクリプトの制御を強化し、さまざまな場面で出力を効率的に管理するために非常に役立ちます。