はじめに (対象読者・この記事でわかること)

この記事は、CentOS(主に7/8/Stream)を使い始めたばかりのエンジニアや、突然「ls *」が効かなくなったと感じた中級者向けです。
記事を読むことで、以下のことが即座にわかります。

  • なぜ「ls *」や「ls ???」が期待通りに動かないのか
  • 1行のコマンドで即座にワイルドカードを有効にする方法
  • 永続的に直す設定の書き方

ちなみに私も、VPSにCentOS 7を入れた直後に「ls /var/log/*.log」が展開されず、10分間「ファイルシステムが壊れた!?」と焦った経験があります。

前提知識

  • Linuxにログインしてコマンドを打てること
  • *」「?」がワイルドカードであることは知っていること
  • エディタ(viでもnanoでも)でファイルを編集できること

ワイルドカードが効かない!?その原因は「エイリアス」にあった

CentOSのデフォルトシェルはbashです。ところが、CentOS 7以降の/etc/profile.d/colorls.shには、以下のようなエイリアスが定義されています。

Bash
alias ls='ls --color=auto'

問題はこれだけではありません。実は、~/.bashrc/etc/bashrcに以下の行が入っていることがあります。

Bash
set -o noglob

noglobset -fと同じ)を有効にすると、ワイルドカードが展開されなくなります。CentOSの初期状態ではこれがコメントアウトされていますが、社内テンプレートやVPSプロビジョニングスクリプトがこれを有効にしてしまうことがあります。

結果として、

Bash
$ ls /etc/*.conf ls: cannot access '/etc/*.conf': No such file or directory

のように「ファイルが存在しない」エラーが出て、ワイルドカードが効いていないように見えるのです。

即解決!ワイルドカードを効かせる3つの手順

ステップ1: 現在の設定を確認する

まず、現在のシェルオプションを確認しましょう。

Bash
$ shopt -p glob # 出力例: shopt -u glob # u = unset → ワイルドカード有効 # 出力例: shopt -s glob # s = set → ワイルドカード無効(noglob状態)

もしshopt -s globと出れば、実はnoglobが有効になっています。

ステップ2: 即座に無効化する

ターミナル上で以下のコマンドを打つだけで、即座にワイルドカードが効くようになります。

Bash
# 一時的にnoglobを無効化 set +o noglob # または shopt -u glob

これで、

Bash
$ ls /var/log/*.log # 展開されて複数の.logファイルがリストアップされる

が正常に動作するはずです。

ステップ3: 永続化して次回以降も効かせる

1行で現在のシェルだけなら問題ありませんが、次回ログインしたときに再発します。永続化するには、~/.bashrcに以下を追加しましょう。

Bash
# ~/.bashrcの最終行に追加 # ワイルドカードを常に有効にする shopt -u glob 2>/dev/null || set +o noglob

保存後、以下のコマンドで再読み込みします。

Bash
$ source ~/.bashrc

ハマった点:「set -o noglob」が読み込まれている場所がわからない

私の場合、~/.bashrcにはset -o noglobの記述がなく、どこで設定されているのかが不明でした。以下のコマンドでスクリプトを grep すると見つかります。

Bash
$ sudo grep -r "set.*noglob\|noglob" /etc/{profile,bashrc,profile.d,bashrc.d} 2>/dev/null

結果として、独自のプロビジョニングスクリプトが/etc/profile.d/strict.shを作成し、そこでset -o noglobを有効にしていたことがわかりました。

解決策:優先順位を上書きする

/etc/profile.d/*.shはアルファベット順に読み込まれるため、例えば/etc/profile.d/zzz_local.shを作成し、最後に必ず読み込まれるようにして以下を記述します。

Bash
# /etc/profile.d/zzz_local.sh # ワイルドカードを再び有効にする set +o noglob

これで、どのプロビジョニングスクリプトが優先しても、最終的にワイルドカードが有効になります。

まとめ

本記事では、CentOSで「ls *」やワイルドカードが効かない原因と、即座に解決する方法を紹介しました。

  • 原因はset -o noglob(またはshopt -s glob)が有効になっていること
  • 1行のset +o noglobで即座に解決
  • ~/.bashrcまたは/etc/profile.d/zzz_local.shに記述して永続化

この記事を通して、CentOSでもワイルドカードが使える「普通の」環境を手に入れられるはずです。
次回は、ワイルドカードを残したままセキュリティを強化する「ファイアウォール+SELinux」の設定について解説する予定です。

参考資料

  • bash 公式マニュアル – The Shopt Builtin
    https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
  • CentOS 7 リリースノート – デフォルトエイリアス
    https://wiki.centos.org/Manuals/ReleaseNotes/CentOS7
  • Red Hat Enterprise Linux 8 カスタマイズガイド – Shell Options
    https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/using-shell-and-command-line-tools_configuring-basic-system-settings