如何修改脚本以在比较时不打印路径?

如何修改脚本以在比较时不打印路径?
cd /tmp
if [[ $(echo "`pwd`" | awk -F '/' '{print $NF}') == "tmp" ]]; then
        echo "YES"
else
        echo "NO"
fi
cd -

是的,打印如下:

YES
/tmp

但我只想

YES

答案1

打印路径的是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

相关内容