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

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

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

ここのドキュメント

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

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

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

使い方

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

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

コマンド << 制限文字列

文章

データ

変数

制限文字列

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

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

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

使い方

簡単な例

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

猫 << _本文終了

ハウツーオタク

レビューオタク

人生に精通した

クラウドに精通したIT

マインドバウンス

_本文終了

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

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

 #!/bin/bash

猫 << “_end_of_text”

あなたのユーザー名は: $(whoami)

現在の作業ディレクトリは $PWD です。

Bash のバージョンは次のとおりです: $BASH_VERSION

_本文終了

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

 chmod +x heredoc-1.sh

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

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

 ./heredoc-1.sh

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

 #!/bin/bash

猫 <<- “_end_of_text”

あなたのユーザー名は: $(whoami)

現在の作業ディレクトリは $PWD です。

Bash のバージョンは次のとおりです: $BASH_VERSION

_本文終了

./heredoc-1.sh 

使い方

タブ文字の処理

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

 #!/bin/bash

猫 << _本文終了

あなたのユーザー名は: $(whoami)

現在の作業ディレクトリは $PWD です。

Bash のバージョンは次のとおりです: $BASH_VERSION

_本文終了

./heredoc-2.sh

タブは端末ウィンドウに書き込まれます。

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

 #!/bin/bash

猫 <<- _本文終了

あなたのユーザー名は: $(whoami)

現在の作業ディレクトリは $PWD です。

Bash のバージョンは次のとおりです: $BASH_VERSION

_本文終了

./heredoc-3.sh

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

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

 #!/bin/bash

真であれば;それから

猫 <<- _limit_string

行 1 の先頭にタブがあります。

行 2 の先頭にタブがあります。

行 3 の先頭にタブがあります。

_limit_string

フィ

使い方

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

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

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

 #!/bin/bash

cat << _end_of_text > session.txt

あなたのユーザー名は: $(whoami)

現在の作業ディレクトリは $PWD です。

Bash のバージョンは次のとおりです: $BASH_VERSION

_本文終了

./heredoc-4.sh

猫のセッション.テキスト

使い方

出力を別のコマンドにパイプする

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

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

 #!/bin/bash

猫 << _本文終了 | sed ‘s/a/e/g’

どうやって

ガーク

_本文終了

./heredoc-5.sh

「ガアク」を「ギーク」に訂正します。

使い方

パラメータを関数に送信する

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

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

 #!/bin/bash

# set_car_details() 関数

set_car_details ()

{

リードメイク

モデルの読み取り

新品_中古品を読む

配信_収集を読む

場所を読む

価格を読む

}

# set_car_details() にデータを渡すヒアドキュメント

set_car_details << _mars_rover_data

NASA

パーサヴィアランス・ローバー

使用済み

集める

火星 (経度、緯度) 77.451865,18.445161

22億

_火星探査機データ

# 車両の詳細を取得する

エコー「メイク:$make」

エコー「モデル: $model」

echo “新品または中古品: $new_used”

echo “配送または回収: $delivery_collect”

エコー「場所: $location」

エコー「価格\$: $price」

 ./heredoc-6.sh

車両の詳細が端末ウィンドウに書き込まれます。

電子メールの作成と送信

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

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

 #!/bin/bash

記事=”ここにドキュメント”

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 dave@remote-pc.local << _remote_commands

# ここで何か作業をしてください

# 接続ログを更新する

echo $USER “-” $(date) >> /home/dave/conn_log/script.log

_remote_commands

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

 ./heredoc-8.sh

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

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

 cat conn_log/script.log

各接続がリストに表示されます。

奇妙な名前、きちんとした特徴

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

「 Linux 上の Bash で「ヒアドキュメント」を使用する方法」に関するベスト動画選定!

【Linux】bashでログを退避させるスクリプトを作って、crontabに仕込むまでをやってみた。
【Linuxの基礎#8】シェルスクリプトの基礎