
次の文が次のように異なる動作をするのはなぜ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-256color
。screen-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
解決策:
変数参照:
$ printf "%s : %s : %s\n" "$TERM" "${TERM//[^[:alnum:]]/_}" "${TERM//[^[:alnum:]]/?}" xterm-256color : xterm_256color : xterm?256color
ファイル名拡張子をオフにする
$ (set -f; printf "%s : %s : %s\n" $TERM ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?}) xterm-256color : xterm_256color : xterm?256color
nullglob
シェルオプションをオフにする$ (shopt -u nullglob; printf "%s : %s : %s\n" $TERM ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?}) xterm-256color : xterm_256color : xterm?256color