1

我注意到 find -execdir 是不可移植的,所以我决定找到一种可移植的方式来使用 find -exec 来达到相同的效果。为此,必须能够确定“find”找到的从“/”到目录的路径是否包含任何符号链接,如果包含则拒绝遍历它。我编写了一个小脚本来确定给定路径是否包含符号链接,但无论我给出什么,它似乎总是返回代码 1。不会触发任何打印任何内容的命令,除非我给它一个非目录,在这种情况下会触发第一个 printf 命令。

#!/bin/sh -e
# If any commands fail, the script should return a nonzero status
[ -d "$1" ] || printf "%s is not a directory" "$1" && exit 1  # Tests if argument is a directory
cd "$1" || echo "Could not change directory" && exit 1 # If it is a directory, goes to it
until [ "$PWD" = '/' ] # Loop until root directory reached 
do
    cd .. || echo "Could not change directory" && exit 1 # Go to parent directory
    [ -d "$PWD" ] || printf "%s is not directory" "$PWD" && exit 1 # Check that this is a directory
done
echo "Given an okay directory"
exit 0
4

3 回答 3

1

在 bash 中(与类 c 语言不同)&&||具有相同的优先级。这意味着你的

command || echo error && exit 1

语句被解释为

{ command || echo error } && exit 1

因为echo即使command没有成功也很可能会成功,所以第一个块将成功并且exit语句将被执行。

于 2013-10-12T01:46:09.310 回答
1

对于每个条件行,您应该将失败用 括起来()。例如:

[ -d "$1" ] || (printf "%s is not a directory" "$1" && exit 2)

我将进一步解释@Kevin 写的内容:如果第一条语句失败(the [ -d ]),则执行第二条语句。由于第二个成功(仅在极少数情况下 printf 失败),因此执行最后一个语句。在这种格式下,只有前两个都失败时才会执行退出语句。如果它不是一个目录,你会得到一个 printf 和一个退出。如果它是一个目录,则第一个为||真,并且 bash 不会费心测试下一个 (printf),并&&再次转到作为出口的 . 将故障封闭起来可以防止这种情况发生。

于 2013-10-12T05:13:46.363 回答
0

可以$1反相检查是否不是目录,返回true后! -d用于if; then执行命令。

#!/bin/sh -e
# If any commands fail, the script should return a nonzero status
if [ ! -d "$1" ]
then
    printf "%s is not a directory" "$1"
    exit 1 # Tests if argument is a directory
fi
cd "$1" # If it is a directory, goes to it
until [ "$PWD" = '/' ] # Loop until root directory reached
do
    cd .. # Go to parent directory
done
echo "Given an okay directory"
exit 0
于 2013-10-12T05:16:45.107 回答