Bash
bash“模式替換”僅在某些情況下失敗
為什麼/將以下
printf
語句的行為基於…而有所不同?(GNU bash,版本 4.4.18(1)-release (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 :
附加資訊:
我只是嘗試了相同的命令行,但是用星號替換了問號,並且發生了相同的失敗和成功。這可能是一個與萬用字元有關的問題嗎?該欄位應該被視為字元串值,而不是 glob。然後我嘗試轉義字元並得到以下結果,對於上述六種星號純文字,帶有一個反斜杠和兩個反斜杠,用於
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
我可以重現:
$ 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