Bash

bash“模式替換”僅在某些情況下失敗

  • March 13, 2018

為什麼/將以下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-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

我可以重現:

$ 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
  1. 關閉文件名擴展
$ (set -f; printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?})
xterm-256color : xterm_256color : xterm?256color
  1. 關閉nullglob外殼選項
$ (shopt -u nullglob; printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?})
xterm-256color : xterm_256color : xterm?256color

引用自:https://unix.stackexchange.com/questions/429948