Linux

提示定制:沒有tty時如何檢測

  • January 3, 2010

我有一個帶有顏色的自定義提示(使用 tput),每次我在伺服器中啟動一個非互動式會話時,我都會收到一堆錯誤。

例如,如果我像這樣開始一個非互動式會話:

ssh root@hostname6 "echo 'hello' ; echo $TERM"

我得到的輸出是:

hello
xterm
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
stdin: is not a tty

所以即使會話是非互動式的,$TERM 變數也有一個值。

我必須檢測什麼條件,以便在我啟動非互動式 shell 時忽略提示自定義部分?

這些tput命令在分配給 PS1 時進行評估。由於啟動文件是在啟動 ssh 會話時處理的,因此即使您的會話不是互動式的,也會進行分配。您可以對此進行測試,並且僅在實際開始互動式會話時才進行分配。

if [[ $- =~ i ]]
then
   # set PS1 using tput
else
   # set a plain PS1 (or use hard-coded escape sequences)
fi

TTY 有一個內置的 bash 測試。忘記什麼時候加的了,3.0?我相信它是相對較新的。我在腳本中使用它,當它從 cron 執行或使用者直接執行它時,我需要不同的行為。

if [ -t 0 ]; then
  echo "I'm a TTY"
fi

引用自:https://serverfault.com/questions/97011