if 语句中的大写 -N 选项是什么意思?

if 语句中的大写 -N 选项是什么意思?
man test

仅解释-n含义,带有小写 n。

大写的 -N 在此脚本中如何工作?

#!/bin/bash

# Check for an altered certificate (means there was a renew)
if [[ -N '/etc/letsencrypt/live/mx1.example.com/fullchain.pem' ]]; then  
   # Reload postfix
   /bin/systemctl reload postfix
   # Restart dovecot
   /bin/systemctl restart dovecot
fi  

答案1

-N(for ew)选项N在 1996 年的 3.0.1 版本中被添加到 zsh 的条件表达式中,以支持新的checkmail自动加载功能,该功能可用于检查您的任何邮箱中是否有新邮件($MAIL, $mailpath...)

它通过检查文件的修改时间是否比上次访问时间更新来实现这一点,换句话说,自上次修改以来尚未读取该文件(自从您在应用于邮箱文件时收到电子邮件以来)。

来自Changelog从那时起的文件:

Sun Aug 25 23:06:43 1996  Zoltán Hidvégi  <[email protected]>

        * Functions/checkmail, Doc/zsh.texi, Doc/zshmisc.man, Src/cond.c,
          Src/parse.c: new -N contitional test to check if the access time
          of a file is not newer than its modification time.  A new
          checkmail function is also included to check mailpath or the
          given forlers for new mails.

有趣的是,该checkmail功能从未被记录下来(它仍然包含在 中zsh,您仍然可以这样做autoload checkmail; checkmail),并且该功能(在每次提示之前检查新电子邮件)已经内置在 shell 中,就像 80 年代的 Korn shell 中一样。明年,stat3.1.2 中引入的新内置函数也使得该-N测试变得不必要,因为mtime > atime检查可以手动完成,所以很幸运标志存在。

然而,后来它test -Nbash(1998 年的 2.02)、ksh93(2003 年的 ksh93o)和yash(2010 年的 2.22)复制。

如今,由于性能原因,许多系统选择不再更新文件的访问时间戳,因此它不再那么有用。

答案2

这是一个 Bash 条件表达式,而不是一般的test条件表达式。它的意思是

-N 文件

为真,如果文件存在并且自上次读取以来已被修改。

-N如果文件的修改时间晚于其访问时间,则为 true。

相关内容