bashのパス名展開を抑止する

見栄えを考慮して*(アスタリスク)でお洒落に飾り付けたメッセージをechoした際に、予期せぬ結果となりたいへん困惑したものである。

$ ls
avava

$ msg="* THIS IS TEST MESSAGE. *"
$ echo ${msg}
avava THIS IS TEST MESSAGE. avava

どうも * がワイルドカードとして扱われてパス名展開されていけない。此れを抑制するには変数をダブルクォーテーションで囲い込んでやればよかった。

$ echo "${msg}"
* THIS IS TEST MESSAGE. *

なおbashのマニュアルによればset -fset -o noglobコマンドによってもパス名展開を抑止できる模様である。

$ man bash
(snip)
   set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
   set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
      -f      Disable pathname expansion.
      -o option-name
          noglob  Same as -f.

ひとたび抑止を有効にすれば、変数をダブルクォートしようがしまいが同じことである。

$ msg="* THIS IS TEST MESSAGE. *"
$ set -f

$ echo ${msg}
* THIS IS TEST MESSAGE. *

$ echo "${msg}"
* THIS IS TEST MESSAGE. *

一方でパス名展開を望む場面でも断固として抑止されるから、取り扱いは勢い慎重にならざるを得ない。パス名展開を再開するならset +fset +o noglobである。

$ ls *
ls: cannot access '*': No such file or directory

$ set +f

$ ls *
avava

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください