gpt4 book ai didi

linux - 为什么这个 shell 脚本不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:24 24 4
gpt4 key购买 nike

我注意到 find -execdir 不可移植,因此我决定寻找一种仅使用 find -exec 来实现相同效果的可移植方法。为此,必须能够确定“find”找到的从“/”到目录的路径是否包含任何符号链接(symbolic link),如果包含则拒绝遍历它。我写了一个小脚本来确定给定路径是否包含符号链接(symbolic link),但它似乎总是返回代码 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

最佳答案

对于每个条件行,您应该将失败包含在 () 中。例如:

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

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

关于linux - 为什么这个 shell 脚本不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19329531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com