最新情報

2022年5月の記事一覧

講習会マシンのシェルを使い易く:bashでtabキー補完によって$記号がエスケープするのを防ぐ方法は?

オープンCAE勉強会@富山や,オープンCAE学会のOpenFOAM講習会用に作成・公開した仮想マシンは,Ubuntu系のOSを使っています。

すこし前から,bash の補完機能が変わって,使いにくくなっていました。例えば,端末・ターミナルからOpenFOAMに付属する例題が格納された場所 $FOAM_TUTORIALS の中身を確認しようとして,ll $FOAM_TUTORIALS/ とタイプしたところでTABキーを押します。すると,$ 記号がエスケープされてしまい,端末に打ち込んでいた文字列が ll \$FOAM_TUTORIALS/ と変化します。こうなってしまうと,せっかくOpenFOAMの環境として設定してある変数 FOAM_TUTORIALS が使えない状態になり,再度キー入力が必要になってしまいます。

むかしむかしは,このようなことを気にせずに,途中まで入力し,TABキーを1,2回押して候補を確認した後に入力,という使い方ができました。これができないので,ストレスを感じてしまいます。

このストレスの解消方法をメモします。ザッと調べたところ,2つの方法があるようです。

  1. shopt -s direxpand で先に変数を展開してしまう,
  2. shopt -u progcomp で programmable completion を無効化する。

参考ページ:https://askubuntu.com/questions/70750/how-to-get-bash-to-stop-escaping-during-tab-completion

shopt は,bashの動作設定の表示や変更をするコマンドです。

https://atmarkit.itmedia.co.jp/ait/articles/1912/12/news034.html https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

direxpand

端末・ターミナルで,次のコマンドを実行します。

shopt -s direxpand

direxpand

If set, Bash replaces directory names with the results of word expansion when performing filename completion. This changes the contents of the readline editing buffer. If not set, Bash attempts to preserve what the user typed.

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

direxpand (directory expansion) オプションを有効にすることで,補完したときに変数名ではなく,実際のアドレスを表示するようになります。

補完前

ll $FOAM_TUTORIALS/

補完(TABキーを1度押した)後

ll /home/user/OpenFOAM/OpenFOAM-v2106/tutorials/

普通に使う場合は,これでも良いかもしれません。講習会で使う場合には,人によって環境が異なるため,変数名のままで作業したいです。その場合には,次の方法を選択します。

progcomp

端末・ターミナルで,次のコマンドを実行します。

shopt -u progcomp

progcomp

If set, the programmable completion facilities (see Programmable Completion) are enabled. This option is enabled by default.

progcomp (programmable completion) オプションを無効にすると,変数名はそのままとなります。(デフォルトで有効になっている。)

補完前

ll $FOAM_TUTORIALS/

補完(TABキーを1度押した)後[$FOAM_TUTORIALSの中にある候補が表示される]

ll $FOAM_TUTORIALS/
Allclean                   compressible/              mesh/
Allcollect                 discreteMethods/           modules/
Allrun                     electromagnetics/          multiphase/
Alltest                    financial/                 preProcessing/
DNS/                       finiteArea/                resources/
IO/                        heatTransfer/              stressAnalysis/
basic/                     incompressible/            verificationAndValidation/
combustion/                lagrangian/    

ただし,この方法では,intelligent な補完オプションが無効になるという副反応があるらしい。

元に戻したければ,次のコマンドを実行して,progcomp を有効化してください。

shopt -s progcomp