如果当前目录不存在,如何使我的Bash脚本失败?
如何在
Bash脚本中检测当前目录是否不存在,并且使用“您当前目录不存在!”之类的消息干净地失败. ?
那么如何编写一个可以在以下示例中使用的脚本呢? $mkdir /tmp/wow $cd /tmp/wow $pwd /tmp/wow $rm -fr /tmp/wow $my_script.sh Your current directory doesn't exist! 解决方法
非便携式答案
(这取决于标准的UNIX文件系统实现细节 – 没有什么太可怕或不可移植 – 但也有关于文件系统的stat(2)系列调用的特定实现;因此,这里有龙). 每个inode(包括目录的inode)都保留“链接计数” – 对它的引用数.对于文件,这表示硬链接的数量;对于目录,来自父级的链接是1,即.目录是另一个,并且..从任何子目录添加第三个或更晚的. (如果目录是/,当然,没有来自父级的链接). 如果文件系统正确使用此记帐,则统计数据将反映链接的数量.从而: #!/bin/bash link_count=$(stat --format=%h .) ## --format=%h requires GNU stat if (( link_count == 0 )); then ## 0 works w/ ext* on Linux,not guaranteed elsewhere echo "This directory has been deleted! Voluntarily exiting" >&2 exit 1 fi 但是,并非所有操作系统都正确地公开了此会计.例如,对于MacOS上的HFS文件系统,即使目录与其父节点断开链接,目录也不会显示小于2的链接数(因此仅通过内存中的引用计数存在 – 如下所述). 便携式答案 简写 虽然您的当前目录可以取消链接(也就是说,从可以用来从文件系统根目录转移到它的父目录没有链接到它),但您当前的目录不可能存在.由于将内存引用计数保持在零以上,即使不存在将其作为子目录的父目录,作为当前目录强制目录继续存在. 长形式(和越野车,破损的解决方法) 如果您愿意在移动目录时出现误报: #!/bin/sh [ -d "$PWD" ] || { echo "Your current directory doesn't exist!" >&2; exit 1; } 也就是说,当你创建一个新的和不同的目录时,这并没有检测到这种情况.为了解决这个问题,我们可能会添加一些额外的逻辑,如下所示: # perl isn't *truly* portable,in the POSIX-specified sense,but it's everywhere. ino() { perl -e '@s=stat($ARGV[0]); printf("%s %sn",$s[0],$s[1]);' "$@"; } cur_ino=$(ino .) pwd_ino=$(ino "$PWD") if [ "$cur_ino" != "$pwd_ino" ]; then echo "Directory has been replaced! Following..." >&2 cd "$PWD" || exit fi 但是,与任何其他文件一样,在目录上具有打开句柄将阻止它被删除.因此,你的示例中的rm -rf / tmp / wow并没有真正删除目录,直到你的shell(和任何其他软件)不再存在,因为在此之前,它的内存引用计数不是0 . 因此,当[-d. ]告诉你,你的目录仍然存在,即使它已被删除…这实际上是真的!您的目录仍然存在,因为您的shell当前在其中的事实迫使它继续存在. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |