shell脚本中@0的含义

shell脚本中@0的含义

/etc/init.d/sudo我正在Ubuntu 14.04 Linux 系统中查看该脚本。在阅读剧本时,我发现这样的说法:

find /var/lib/sudo -exec touch -d @0 '{}' \;

这里有什么意义@0呢?上面的语句有什么作用呢?

答案1

bash这与或无关sudo。该find命令使用-exec操作在找到的每个文件上运行给定的命令。在这种情况下,正在运行的命令是

touch -d @0

如果你检查man touch一下 GNU 系统,你会发现

   -d, --date=STRING
          parse STRING and use it instead of current time

因此,这是选择要为目标文件设置-d日期的一种方法。touch告诉@GNU 实现touch这是一个定义为的日期自纪元以来的秒数。由于它实际上是 0 秒,因此这意味着 UNIX 时间的开始。检查这一点的一个简单方法是为 GNUdate命令提供相同的日期:

$ TZ=UTC date -d @0
Thu Jan  1 00:00:00 UTC 1970

因此,您显示的命令将查找其中的所有文件和目录,/var/lib/sudo并将其上次修改日期设置为 1970 年 1 月 1 日星期四的 00:00 UTC。


该线存在的原因在中得到了很好的解释评论以下:

@crisron 该行的目的是确保来自任何先前 sudo 实例的所有 sudo 密码均已过期。用户第一次运行 sudo 时,对于每个会话,它将在该目录中创建一个文件。然后,Sudo 在下次运行文件时检查文件上的时间戳,以决定是否再次要求您输入密码。此行确保当 sudo 守护程序重新启动时,用户下次执行 sudo 操作时必须重新输入所有密码。 – 克罗

答案2

@0是纪元日期。更一般地说,@x 是纪元之后的 x 秒。例如:

$ touch -d @0 foo
$ TZ=UTC0 ls -l foo
-rw-r--r-- 1 vinc17 vinc17 0 1970-01-01 00:00:00 foo

注意:-d该实用程序的选项touch由 POSIX 指定,但仅适用于 ISO8601 形式的字符串。其他形式的字符串特定于每个实现,特别是 @x 形式是 GNU 扩展。

答案3

该行执行以下操作:

/var/lib/sudo定义工作目录。

-exec touch -d @0 '{}' \;是要执行的操作。让我们把它分成几个部分:

-执行先于实际行动。

触摸-d更改文件时间戳解析参数字符串并使用它而不是当前时间。

@0是一个时间戳,相当于:

root@debian:/var/log# date -d @0
Wed Dec 31 21:00:00 ART 1969

所以底线是:

当 find 命令找到匹配项时,将时间戳更新为 Wed Dec 31 21:00:00 ART 1969。

相关内容