加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如果当前目录不存在,如何使我的Bash脚本失败?

发布时间:2020-12-16 01:49:49 所属栏目:安全 来源:网络整理
导读:如何在 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当前在其中的事实迫使它继续存在.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读