Bash

如何修改腳本以在比較時不列印路徑?

  • December 20, 2020
cd /tmp
if [[ $(echo "`pwd`" | awk -F '/' '{print $NF}') == "tmp" ]]; then
       echo "YES"
else
       echo "NO"
fi
cd -

是的,列印如下:

YES
/tmp

但我只想

YES

列印路徑的是最後的cd -命令。它列印路徑,以便您可以看到最終進入的工作目錄。這是使用操作數(單個破折號)cd呼叫時的特殊行為,在這種情況下,它等效於-

cd "$OLDPWD" && pwd

為避免這種情況,您可以cd "$OLDPWD"改用 (OLDPWD是一個保存前一個工作目錄值的特殊變數),但請注意,如果cd /tmp 失敗並且您的程式碼輸出NO,那麼兩者都cd -可能cd "$OLDPWD"會將您帶到一個意外的目錄。

相反,使用

(
   cd /tmp
   if [[ $(echo "`pwd`" | awk -F '/' '{print $NF}') == "tmp" ]]; then
       echo YES
   else
       echo NO
   fi
)

第一個cd不會影響(...)子shell 之外的工作目錄。

此外,您的測試將更安全有效地執行

if [[ $PWD == */tmp ]]; then
   echo YES
else
   echo NO
fi

PWD變數將包含目前工作目錄的路徑名,並且通常是您想要使用的,而不是pwd命令。該測試只是測試目前工作目錄的路徑名是否以 string 結尾/tmp,這也是您的awk程式碼似乎也想做的事情(但如果路徑名包含換行符,則會失敗)。

如果您只想檢查是否可以cd進入/tmp,但實際上不這樣做,請使用

( if cd /tmp; then echo YES; else echo NO; fi )

在具有外部cd實用程序的系統上,例如 macOS 和 Solaris,您可以像這樣使用它:

if /usr/bin/cd /tmp; then
   echo YES
else
   echo NO
fi

外部cd實用程序實際上永遠不能用於更改工作目錄,但它仍然可以在諸如確定是否可以更改到特定目錄的測試中有用。另請參閱cd 外部命令的意義何在?

如果您要做的是測試是否/tmp存在並且是目錄(或目錄的符號連結),那麼最常見的方法不是使用測試,cd而是使用如下測試:

if [ -d /tmp ]; then
   echo YES
else
   echo NO
fi

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