Red Hat Learning Subscription (RHLS): ③コピー&ペーストの裏技
はじめに
この記事ではRHLSの演習環境でコピー&ペーストをするときのちょっとしたコツや裏技について紹介しようと思います。これらは、RHLS固有ではなく、バーチャルトレーニングでも全く同様です。ここで紹介する方法はインストラクターとしてトレーニング中に実際に受講者に説明したことがあるものばかりです。
コピー&ペースをするべき時とは
レッドハットの演習のインストラクションは、ターミナル上でLinuxコマンドを打って、その結果を確認するというのが一般的です。とくに管理者向けのトレーニングでは、ほとんどの演習がターミナル上で実施します。開発者向けのコースの演習ではVSCode上でJavaやJavaScript、Pythonなどのプログラミングコードを入力することも多いです。
演習のインストラクションに登場したコマンドをコピー&ペーストすると、コマンドを自分で入力しないためにまったく頭に残りません。技術を習得したい、認定試験に合格したいという目的がある場合、コマンドをコピー&ペーストすることは学習効果を著しく下げるので基本的に避けるべきであると考えます。
しかし一方で、演習のインストラクションに登場した文字列をすべて手で打つことがどのような場合でも適切なのかというと、そうではないと思います。以下で手でタイプすべきものと、コピー&ペーストすべきものの例をあげてみます。
手でタイプするのが好ましいもの:
コマンド
コマンドオプション
タブ補完入力で簡単に入力できるファイルパス
コピー&ペーストするのが好ましいもの:
設定名、人名などの固有名詞
複雑なコマンドオプションの値
base64エンコーディング文字列
長大なYAMLファイル、XMLファイル
サンプルコード
コマンドやコマンドオプションはタブ補完入力を利用することですべてを手で入力する必要がありません(タブ補完入力とは、最初の何文字かを入力した後にTabキーを押すことで残りを自動的に入力することができること)。
また、manコマンドやコマンドhelpによってターミナル上にコマンドの使い方を表示することも可能です。コマンドやコマンドオプションについてはmanコマンド等で調べながら入力するのがLinuxの世界ではごく普通のやり方ですし、その方が学習効果が高いと思われます。
一方で、タブ補完入力できないような、固有名詞やYAMLファイルのコンテンツのようなものは、手で入力するよりも、コピー&ペーストした方が正確に入力できます。これらの入力過程でタイプミスすることが致命的な場合があります。業務でのサーバー構築や、認定試験のような、できるだけ入力ミスを避けたい場合は、積極的にコピー&ペーストを活用すべきと考えます。
さらに、その製品の初心者が演習を実施した場合、インストラクション通りに手で入力しても思ったような結果が得られない、エラーになるという場合もあるのでしょう。そのような場合は、インストラクションのコマンドをまるごとコピーしてターミナル上で動作確認してみるというのもアリだと思います。
演習環境でのコピー&ペーストの基本
トレーニングの演習環境において、ホスト上のテキストからターミナルへ文字列をコピー&ペーストする基本方法は、演習環境の画面右上に配置されている以下の2つのボタンを使います。
Enable Host Paste
Open Text Dialog

一番左のボタンが Enable Host Paste、左から2番目のボタンが Open Text Dialogです。これらの使い方は前回の記事で紹介していますので、馴染みのない方はこちらを参照してください。
不要なシェルプロンプトを削除する裏技
バックスラッシュによる長いコマンドの分割
トレーニングの演習のテキストにおいて、複数行のコマンドが以下のように表現されていることがあります。
[student@workstation control-handlers]$ ansible-navigator run \
> -m stdout configure_webapp.yml --syntax-check
これは、コマンドが一行ではテキストの幅に収まらないためにバックスラッシュ(\)を入れることで2行に分割している例になります。
行の最後に置かれているバックスラッシュ(\)のすぐ右隣には改行コードが置かれています。バックスラッシュの次の文字は無効になるので、結果として上の複数行のコマンドは、1行のコマンドを実行した結果と同じです。
たとえば、以下のechoコマンドの例ではAAA\の次の文字として改行コードが置かれていますが、結果はecho AAABBBを実行したのと同じです。
$ echo AAA\
> BBB
AAABBB
バックスラッシュをbashがどのように処理するかを理解するために、上のコマンドをターミナル上で実際に手で入力してみましょう。
(1) まず、バックスラッシュまで手で入力します。
[student@workstation control-handlers]$ ansible-navigator run \
(2) 次に、バックスラッシュの直後にEnterキーを押します(これで改行コードが入ります)と、次の行に > というbashのプロンプトが現れてコマンドの入力待ちの状態になります。
[student@workstation control-handlers]$ ansible-navigator run \
>
(3) 最後に、> の後ろに残りのコマンドを手で入力し、最後にEnterキーを押すとコマンドが実行されます。
[student@workstation control-handlers]$ ansible-navigator run \
> -m stdout configure_webapp.yml --syntax-check
バックスラッシュを含む複数行コマンドのコピー&ペーストの方法
上で示したようにコマンドを手で入力するのであれば何も問題は発生しません。しかし、Enable Host Pasteを使って上記の2行のコマンドをまるごとコピーし、ターミナルにペーストすると、以下のようにペーストされてコマンドが期待したように実行されません。
[student@workstation control-handlers]$ ansible-navigator run \
> > -m stdout configure_webapp.yml --syntax-check
ペースト結果を見ると、2行目の先頭に > > のようにプロンプトが2つ現れています。つまり、コピー元にbashが出力するべき > を入れていたために、ペーストされたコマンドに余分な > が含まれてしまったのです。これは以下を実行したのと同じ効果になります。これでは意図したように動作しません。
ansible-navigator run > -m stdout configure_webapp.yml --syntax-check
Open Text Dialogを使った余分なプロンプト問題の解決
このようにコピー元に余計なプロンプトが含まれている場合、それを取り除いてからでないと正しくペーストできません。このような場合は、Open Text Dialog を使うと便利です。以下のようにペーストした時点では余分な > が2行目の先頭に入っていますが、それを削除してから、[Send] キーを押せばよいのです。


注意
バックスラッシュ(\)を入れてコマンドを複数行に分割した場合、次の行の先頭にプロンプト(>)をインストラクションに含めるかどうかは、コースによってまちまちで統一されていません(古めのコースではインストラクションのコマンドに > を含めているものをよく見かけます)。複数行のコマンドをコピーするときに、バックスラッシュの次の行の先頭に > が含まれている場合、それはシェルが出力するプロンプトなので無視してください。
Windows上でのコピー&ペーストの裏技
Windows上でのコピー&ペーストの問題
注意: ここでの話題はWindows固有のものなので、MacOSやLinuxの方は読み飛ばしてください。
ホストの文字列をRHELにコピーする方法は、Enable Host Pasteが基本ですが、複数行の文字列をWindows上でコピーしてRHEL上のアプリにペーストすると改行が余計に入って思い通りにならないことがあります。
たとえば、Windows上で複数行にまたがる以下のコマンドをコピー&ペーストした場合に問題が発生します。
oc new-app --template mysql-persistent \
--param MYSQL_USER=operator --param MYSQL_PASSWORD=myP@55 \
--param MYSQL_DATABASE=mydata \
--param DATABASE_SERVICE_NAME=db
Enable Host Pasteを有効にした状態で、上の複数行のコマンドをWindows上でコピーして、RHEL内のエディタ上でCtrl-Vで貼り付けると、以下のようになります。行間に余計な改行コードが入っていることがわかります。
oc new-app --template mysql-persistent \
--param MYSQL_USER=operator --param MYSQL_PASSWORD=myP@55 \
--param MYSQL_DATABASE=mydata \
--param DATABASE_SERVICE_NAME=db
各行の末尾に余分な改行コードが入っているため、シェルによって上記の文字列は4つの別々のコマンドとして認識されます。これにより、最初の行は実行されるものの、2行目以降はそのようなコマンドが存在しないためエラーになります。しかも、最初の行のコマンドは環境変数を指定していないので、意図した実行結果になりません。


なぜこのようなことが起こるのでしょうか? これはWindows上のテキストの改行コードがCR, LFという2文字であるのに対して、Linux上の改行コードがLFだけなので、WindowsからRHELに文字列をコピーすると、Linux上で改行コードが余計についているように処理されるからです。
Windows上でのコピー&ペーストのやり方
Windows上で、Enable Host Pasteを使って複数行をまとめてペーストするとうまくいかないことがわかりました。これに対応するためには、以下の2つの方法が考えられますが、どちらも手間がかかるのであまり便利な方法とは言えません。
一行づつ別々にコピー&ペーストを実行する(上の例では4回コピー&ペーストする)
メモ帳のようなエディタに複数行のコマンドをペーストし、バックスラッシュと改行コードを取り除いて長い1行のコマンドに変換してから、ターミナルへコピー&ペーストする。
Open Text Dialogを使った改行問題の解決
Windows上における改行問題をスマートに回避するために Open Text Dialog を使うことができます。Open Text Dialog にペーストすると、ダイアログにペーストされた時点で行末に含まれる余分な改行コードは自動的に削除されます。これによって上記のような改行問題は発生せず、きれいにRHELに転送されます。


高速にコピー&ペーストができる裏技
次に、裏技と呼ぶには気恥ずかしい方法の紹介です。
workstationサーバーのFirefoxブラウザー上でrol.redhat.comにアクセスしてHTMLやEPubのテキストを表示します。そうすればホストとRHEL間での文字列の転送は発生しませんから、RHEL内のアプリケーション間で自然にコピー&ペーストができるようになります(あたり前ですね)。もうEnable Host Pasteを有効にする必要はありません!

具体的な例をあげると、製品ドキュメントからYAMLファイルをまるごとコピーする場合や、Javaのpom.xmlの定義を修正する場合、どうしても複数行の修正が発生します。これらの例で、Enable Host Paste や Open Text Dialog を使ってホストから大量のデータをコピー&ペーストしようとすると時間がかかります。そのような場合は、むしろ、RHEL内でテキストを表示させてコピー&ペーストした方が早く転送できます。
ターミナルのログをホスト側に貼る裏技
注意
ここで説明する方法は、RH124、RH134、RH199、RH294、DO180などのコースに限定されたやりかたです。すべてのコースの演習環境に適用できるわけではありません。
Enable Host Paste や Open Text Dialog は、ホスト側からRHEL側への文字列のペーストを支援する機能です。しかし、RHEL側からホスト側への逆方向の文字列のペーストはサポートしてくれません。
workstationサーバー内でターミナルを実行していてコマンドの動作を確認しているとき、そのコマンドの実行結果をホスト側のファイルとして保存したいことがあります。Wordの文書に「RHLS演習の記録」のようなメモを作ってそこに今日学んだコマンドの内容を記録したい場合や、意図せぬコマンドエラーを記録しておきたい場合などです。
このような場合に「教室Webアプリ」を使うと便利です。RH124の [演習環境] には [教室Webアプリ] の赤いボタンが表示されます。

RH134やRH294では「教室Webアプリ」は仮想マシンの操作画面の下の方にClassroom Web Terminal という名前で表示されています。

教室Webアプリを起動すると、RHLSポータルを表示している同じブラウザーの別のタブとしてworkstationのターミナルが開きます。

教室Webアプリは、ホスト上の単なるWebアプリなので、他のアプリとの間で相互にコピー&ペーストができます。以下の例ではworkstationのターミナル上でCtrl-Cでコピーした文字列をWindowsのメモ帳へCtrl-Vでペーストしています。

おわりに
演習実施時にコマンドはできるだけ手でタイプするのが基本ですが、文字列をコピー&ペーストをした方が効率的に学習できるケースもあります。この記事ではRHLSやバーチャルトレーニングの演習環境内でコピー&ペーストをするときの裏技をまとめました。演習環境固有の話なので学習の本質とは無関係な話題ですし、少しマニアックなテーマになってしまいましたが、存在意義がわからなかった Open Text Dialog が意外と使えるヤツだと認識していただければ嬉しいです。