bash 「パターンの交換」は、特定の状況でのみ失敗します。

bash 「パターンの交換」は、特定の状況でのみ失敗します。

次の文が次のように異なる動作をするのはなぜprintfですか? (GNU bash、バージョン4.4.18(1)-リリース(x86_64-pc-linux-gnu))

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?}

権限のないユーザー端末セッションにある場合、tmux出力は次のようになります。

screen-256color : screen_256color : screen?256color

ただし、端末でのroot同じtmuxセッションの出力は次のとおりです。

xterm-256color : xterm_256color :

この外部では、tmuxすべてのユーザーの出力が同じ失敗です。

xterm-256color : xterm_256color :

追加情報:

私は同じコマンドラインを試しましたが、疑問符をアスタリスクに置き換えて、同じ失敗と成功が発生しました。ワイルドカード関連の問題かもしれませんか?このフィールドは、グローバル値ではなく文字列値として扱われる必要があります。その後、文字をエスケープしようとし、上記とケースの1つのバックスラッシュと2つのバックスラッシュを持つアスタリスク一般の6つのケースについて、次の結果を得ましたxterm-256colorscreen-256-color

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/*}

screen-256color : screen_256color : screen*256color
xterm-256color : xterm_256color :

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/\*}

screen-256color : screen_256color : screen*256color
xterm-256color : xterm_256color :

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/\\*}

screen-256color : screen_256color : screen\*256color
xterm-256color : xterm_256color : xterm\*256color

ベストアンサー1

私は再現できます:

$ printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?}
xterm-256color : xterm_256color :

一致するファイルがないからです。模様 xterm?256color

解決策:

  1. 変数参照:

    $ printf "%s : %s : %s\n" "$TERM" "${TERM//[^[:alnum:]]/_}" "${TERM//[^[:alnum:]]/?}"
    xterm-256color : xterm_256color : xterm?256color
    
  2. ファイル名拡張子をオフにする

    $ (set -f; printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?})
    xterm-256color : xterm_256color : xterm?256color
    
  3. nullglobシェルオプションをオフにする

    $ (shopt -u nullglob; printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?})
    xterm-256color : xterm_256color : xterm?256color
    

おすすめ記事