Linux上のBashで「ヒアドキュメント」を使用する方法

公開: 2022-01-29
Linuxコンピュータシステムのターミナルウィンドウ。
Fatmawati Achmad Zaenuri / Shutterstock

奇妙な名前の「ヒアドキュメント」を使用すると、LinuxのBashスクリプト内で入力/出力リダイレクトを使用できます。 これらは、リモートコンピューターで実行する必要のあるコマンドを自動化するための優れた方法です。

ヒアドキュメント

Linuxの多くのコマンドには、2文字または3文字の名前が付いています。 これは、Linuxを習得するのが難しく、難解なコマンドでいっぱいであるという概念を生み出す原因の1つです。 しかし、Linuxで最も奇妙な名前の1つは、不可解な短い名前の1つではありません。 「ヒアドキュメント」はドキュメントではなく、「ヒア」が何を指しているのかも明確ではありません。

それらは比較的あいまいな構成ですが、便利です。 もちろん、これはLinuxなので、猫の皮を剥ぐ方法は複数あります。 ヒアドキュメントによって提供される機能の一部は、他の方法で再現できます。 これらの代替方法は通常、より複雑です。 プログラミングとスクリプティングでは、「より複雑」とは「バグが発生しやすい」ことも意味し、コードの保守が困難であることを意味します。

ここでドキュメントが本当に優れているのは、スクリプト内から確立された接続からリモートコンピューターに送信するコマンドの自動化です。 接続は簡単ですが、接続が確立されたら、スクリプトからリモートコンピューターのシェルにコマンドをどのように「ポンプ」しますか? ヒアドキュメントでは、それを非常に簡単に行うことができます。

ヒアドキュメントの基本原則

ヒアドキュメントの慣用的な表現は次のようになります。

 コマンド<< limit_string
 。
 。
文章 
データ
変数
。
。
limit_string
  • コマンド:これは、リダイレクトされた入力を受け入れる任意のLinuxコマンドにすることができます。 echoコマンドはリダイレクトされた入力を受け入れないことに注意してください。 画面に書き込む必要がある場合は、 catコマンドを使用できます。
  • << :リダイレクト演算子。
  • limit_string :これはラベルです。 コマンドにリダイレクトするデータのリストに表示されない限り、好きなものにすることができます。 これは、テキスト、データ、および変数のリストの終わりを示すために使用されます。
  • データリスト:コマンドに供給されるデータのリスト。 コマンド、テキスト、および変数を含めることができます。 データリストの内容は、_limit_stringが検出されるまで、一度に1行ずつコマンドに入力されます。
広告

制限文字列として「EOF」を使用するヒアドキュメントの例がおそらく表示されます。 私たちはそのアプローチを支持しません。 動作しますが、「EOF」は「ファイルの終わり」を意味します。 ホームドキュメントがスクリプトファイルの最後にあるというまれなケースを除いて、「EOF」が誤って使用されています。

実行していることを参照する制限文字列を使用すると、スクリプトがはるかに読みやすくなります。 一連のコマンドをSecureShell(SSH)経由でリモートコンピューターに送信する場合、「_ remote_commands」のような制限文字列は完全に理にかなっています。 アンダースコア「 _ 」文字で始める必要はありません。 これは、スクリプト内で通常とは異なるものとしてマークされるためです。

簡単な例

コマンドラインおよびスクリプトでヒアドキュメントを使用できます。 ターミナルウィンドウで次のように入力すると、「Enter」を押すたびに「 > 」行の継続プロンプトが表示されます。 「_end_of_text」制限文字列を入力して「Enter」を押すと、Webサイトのリストがcat,渡され、ターミナルウィンドウに表示されます。

 cat << _end_of_text 
ハウツーオタク 
オタクのレビュー 
LifeSavvy 
CloudSavvy IT
MindBounce
_end_of_text 

これは最も価値のある演習ではありませんが、データのリスト全体が照合されて制限文字列に到達するまで、コマンドに何も送信されないことを示しています。 catコマンドは、制限文字列「_end_of_text」を入力して「Enter」キーを押すまで、入力を受け取りません。

スクリプトでも同じことができます。 この例をエディターに入力またはコピーし、ファイルを「heredoc-1.sh」として保存して、エディターを閉じます。

 #!/ bin / bash

cat << "_end_of_text"
ユーザー名は次のとおりです:$(whoami)
現在の作業ディレクトリは次のとおりです:$ PWD
Bashのバージョンは次のとおりです:$ BASH_VERSION
_end_of_text

この記事に従うと、スクリプトを作成するたびに、実行する前にスクリプトを実行可能にする必要があります。 いずれの場合も、 chmodコマンドを使用してください。 ここで使用されているスクリプト名は、各例のスクリプト名に置き換えてください。

 chmod + xヒアドキュメント-1.sh 

広告

このスクリプトには、 $PWD$BASH_VERSIONの2つの環境変数が含まれています。 スクリプトが実行されると、環境変数名はデータ値(現在の作業ディレクトリとBashのバージョン)に置き換えられます。

このスクリプトは、 whoamiコマンドのコマンド置換も使用します。 コマンドの名前は、独自の出力に置き換えられます。 スクリプト全体からの出力は、catコマンドによってターミナルウィンドウに書き込まれます。 スクリプトを名前で呼び出すことで実行します。

 ./heredoc-1.sh 

スクリプトを変更し、ヒアドキュメントの最初の行の制限文字列を引用"で囲むと、データリストがヒアドキュメントコマンドにそのまま渡されます。変数値の代わりに変数名が表示され、コマンドの置換により、行われない。

 #!/ bin / bash

cat <<-"_ end_of_text"
ユーザー名は次のとおりです:$(whoami)
現在の作業ディレクトリは次のとおりです:$ PWD
Bashのバージョンは次のとおりです:$ BASH_VERSION
_end_of_text
 ./heredoc-1.sh 

タブ文字の処理

デフォルトでは、データリストのタブ文字は保持され、ターミナルウィンドウに書き込まれます。 この例をコピーして「heredoc-2.sh」として保存します。 chmodコマンドを使用して実行可能にします。 インデントされた行を編集して、一連のスペースではなく、行の先頭に1つまたは2つのタブ文字があることを確認します。

 #!/ bin / bash

cat << _end_of_text
ユーザー名は次のとおりです:$(whoami)
  現在の作業ディレクトリは次のとおりです:$ PWD
    Bashのバージョンは次のとおりです:$ BASH_VERSION
_end_of_text
 ./heredoc-2.sh 

タブはターミナルウィンドウに書き込まれます。

リダイレクト演算子にダッシュ「 - 」を追加することにより、ヒアドキュメントは先頭のタブ文字を無視します。 この例を「heredoc-3.sh」として保存し、実行可能にします。

 #!/ bin / bash

cat << -_ end_of_text
ユーザー名は次のとおりです:$(whoami)
  現在の作業ディレクトリは次のとおりです:$ PWD
    Bashのバージョンは次のとおりです:$ BASH_VERSION
_end_of_text
 ./heredoc-3.sh 

タブは無視されます。 これは些細なことのように思えるかもしれませんが、スクリプトのセクションがインデントされているため、先頭のタブに対処するための適切な方法です。

広告

ループやその他の論理構造は通常インデントされます。 ヒアドキュメントがスクリプトのインデントされたセクションに含まれている場合、リダイレクト演算子でダッシュ「 - 」を使用すると、先頭のタブ文字によって引き起こされるフォーマットの問題が解消されます。

 #!/ bin / bash

真であれば; それから
  cat << -_ limit_string
  先頭にタブがある1行目。
  先頭にタブがある2行目。
  先頭にタブがある3行目。
  _limit_string
fi

ファイルへのリダイレクト

ヒアドキュメントで使用されるコマンドからの出力は、ファイルにリダイレクトできます。 ヒアドキュメントの最初の行の制限文字列のに、「 > 」(ファイルを作成)または「 >> 」(存在しない場合はファイルを作成し、存在する場合はファイルに追加)リダイレクト演算子を使用します。

このスクリプトは「heredoc-4.sh」です。 出力を「session.txt」というテキストファイルにリダイレクトします。

 #!/ bin / bash

cat << _end_of_text> session.txt
ユーザー名は次のとおりです:$(whoami)
現在の作業ディレクトリは次のとおりです:$ PWD
Bashのバージョンは次のとおりです:$ BASH_VERSION
_end_of_text
 ./heredoc-4.sh
 cat session.text 

出力を別のコマンドに配管する

ヒアドキュメントで使用されているコマンドからの出力は、別のコマンドへの入力としてパイプすることができます。 パイプ「 | ヒアドキュメントの最初の行の制限文字列のの「」演算子。 ヒアドキュメントコマンドcatからの出力をsedにパイプします。 文字「a」のすべての出現箇所を文字「e」に置き換えたいと思います。

このスクリプトに「heredoc-5.sh」という名前を付けます。

 #!/ bin / bash

cat << _end_of_text | sed's / a / e / g '
どのように
に
Gaak
_end_of_text
 ./heredoc-5.sh

「Gaak」は「Geek」に修正されました。

関数へのパラメーターの送信

ヒアドキュメントで使用されるコマンドは、スクリプト内の関数にすることができます。

このスクリプトは、車両データの一部を関数に渡します。 この関数は、ユーザーが入力したかのようにデータを読み取ります。 次に、変数の値が出力されます。 このスクリプトを「heredoc-6.sh」として保存します。

 #!/ bin / bash

#set_car_details()関数
set_car_details()
{{
makeを読む
モデルを読む
new_usedを読む
delivery_collectを読む
場所を読む
価格を読む
}

#データをset_car_details()に渡すヒアドキュメント
set_car_details << _mars_rover_data
NASA
パーサヴィアランスローバー
使用済み
収集
火星(長い、緯度)77.451865,18.445161
22億
_mars_rover_data

#車両の詳細を取得する
echo "Make:$ make"
echo "モデル:$ model"
echo "新規または使用済み:$ new_used"
echo "配信またはコレクション:$ delivery_collect"
echo "場所:$ location"
echo "Price \ $:$ price"
 ./heredoc-6.sh 

車両の詳細はターミナルウィンドウに書き込まれます。

メールの作成と送信

ヒアドキュメントを使用して、電子メールを作成および送信できます。 リダイレクト演算子の前でコマンドにパラメーターを渡すことができることに注意してください。 Linuxのmailコマンドを使用して、ローカルメールシステムを介して「dave」というユーザーアカウントに電子メールを送信しています。 -s (件名)オプションを使用すると、電子メールの件名を指定できます。

この例では、スクリプト「heredoc-7.sh」を作成します。

 #!/ bin / bash

article = "ヒアドキュメント"

mail -s 'ワークロードステータス' dave << _project_report
ユーザー名:$(whoami)
割り当てを完了しました:
記事:$ article
_プロジェクトレポート
./heredoc-7.sh 

広告

このスクリプトからの目に見える出力はありません。 しかし、メールを確認すると、メールが作成、送信、配信されていることがわかります。

 郵便物

SSHでのヒアドキュメントの使用

ヒアドキュメントは、SSH接続が確立された後、リモートコンピューターでいくつかのコマンドを実行するための強力で便利な方法です。 2台のコンピューター間にSSHキーを設定した場合、ログインプロセスは完全に自動化されます。 この手っ取り早い例では、リモートコンピューターのユーザーアカウントのパスワードの入力を求められます。

このスクリプトは「heredoc-8.sh」です。 「remote-pc」というリモートコンピュータに接続します。 ユーザーアカウントは「dave」と呼ばれます。 対話型の疑似端末を割り当てる必要がないため、 -T (疑似端末の割り当てを無効にする)オプションを使用しています。

スクリプトの「ここでいくつかの作業を行う」セクションでは、コマンドのリストを渡すことができ、これらはリモートコンピューターで実行されます。 もちろん、リモートコンピュータにあるスクリプトを呼び出すこともできます。 リモートスクリプトは、実行したいすべてのコマンドとルーチンを保持できます。

スクリプト(heredoc-8.sh)が実行するのは、リモートコンピューターの接続ログを更新することだけです。 ユーザーアカウントと日時スタンプがテキストファイルに記録されます。

 #!/ bin / bash

ssh -T [email protected] << _remote_commands

#ここでいくつかの作業を行います

#接続ログを更新
echo $ USER "-" $(date)>> /home/dave/conn_log/script.log
_remote_commands
広告

コマンドを実行すると、リモートコンピューターのアカウントのパスワードの入力を求められます。

 ./heredoc-8.sh 

リモートコンピュータに関するいくつかの情報が表示され、コマンドプロンプトに戻ります。

リモートコンピューターでは、 catを使用して接続ログを確認できます。

 cat conn_log / script.log 

各接続がリストされています。

関連: LinuxシェルからSSHキーを作成してインストールする方法

奇妙な名前、きちんとした機能

ここでのドキュメントは、特にリモートコンピュータにコマンドを送信するために使用される場合、風変わりですが強力です。 rsyncを使用してバックアップルーチンをスクリプト化するのは簡単なことです。 その後、スクリプトはリモートコンピューターに接続し、残りのストレージスペースを確認し、スペースが少なくなっている場合はアラートメールを送信できます。

関連: rsyncを使用してLinuxシステムをバックアップする方法