最好通过一个小例子来解释这个问题:
创建目录的基础结构,如下所示:
rm -rf /tmp/work
mkdir -p /tmp/work/a/b/c
cd /tmp/work
ln -s a/b/c s
mkdir t
tree
这将导致以下基础结构:
有一种非常简单的方法来检查目录是否存在:
cd /tmp/work
if test -d s/../t; then echo EXISTS; else echo DOES NOT EXIST; fi
但是,似乎'-d'测试仅检查物理路径(a/b/t
);以下内容清楚表明逻辑路径/目录does存在:
cd s/../t
pwd
我希望通过简单的测试来检查这种情况...在检查StackOverflow中的类似问题时,我没有找到将逻辑路径与物理路径区分开的答案...
我进行了蛮力(愚蠢的尝试,以获得更多见识:
for o in -b -c -d -e -f -g -G -k -h -L -O -p -r -S -s -t -u -w -x; do
if test $o s/../t; then echo EXISTS; else echo DOES NOT EXIST; fi
done
按预期,所有测试均指示失败...
最接近简单解决方案的是以下测试:
if (cd -L s/../t &>/dev/null); then echo EXISTS; else echo DOES NOT EXIST; fi
如果使用'-P'而不是'-L',则此语法测试物理路径(等同于'test -d')。
请注意,如果我们确定使用的是内置函数,则语法会稍微简单一些:
if (cd s/../t &>/dev/null); then echo EXISTS; else echo DOES NOT EXIST; fi
但是必须有更好的方法...