【问题标题】:Can I use /dev/null for the find command?我可以将 /dev/null 用于 find 命令吗?
【发布时间】:2015-10-28 01:10:09
【问题描述】:

我正在更新一个使用符号链接后的 find 命令的 shell 脚本:

find -L somedir ...

但是,在某些较旧的平台上,不支持 -L,该命令必须使用较旧的 -follow 语法:

find somedir -follow ...

“-follow”标志在较新的系统上已弃用,因此我的策略是测试该命令是否适用于较新的 -L 标志,如果不能使用 -follow 标志。

该脚本当前在 RedHawk 5.4.11 上运行,但在较旧的 Linux 版本上发现了 find 不兼容问题。我被指示在所有 Unix/Linux 平台上进行这项工作。

因此,在创建一个虚拟的find 命令进行测试时,我在/tmp 中创建了一个空的临时目录,以便find 命令快速返回。然后我发现旧系统不支持mktemp -d,所以我打算用老式的方式创建一个。

然后我恍然大悟,“为什么不尝试将/dev/null 作为临时目录而不是创建一个?”所以我尝试了命令:

TEMPDIR=/dev/null
FIND_L_SUPPORTED=`find -L $TEMPDIR &> /dev/null; echo $?`

它似乎可以工作,但我不知道为什么(因为/dev/null 不是目录),或者它是否在所有平台上都可靠。

两个问题:

  1. 在所有平台上使用 find/dev/null 是否可靠?
  2. 我原来的find 问题的任何其他解决方案,其中一些平台需要-L,但其他需要-follow

【问题讨论】:

  • 要查找的参数不是目录,而是路径。
  • 为什么你认为-L 已被弃用?
  • "on some older platforms, the -L isn't supported""The "-follow" flag is deprecated on newer systems" 对我来说很有意义 ;-) 祝大家好运。
  • 致 O.P.:“在所有平台上都可靠”?这是一项艰巨的任务。与其希望您在此处收到的建议适用于您(或您的客户)环境中最古老、最坚固的机器,不如构建一个肯定的断言测试(确认支持-L-follow)否则您的脚本会失败(在什么情况下)您希望这是 Unix 也不支持的极为罕见的情况)。如果失败消息清楚地表明了问题以及触发的位置,那么未来的维护者将尊重你的名字!也不是mktemp,为什么不只是mkdir -p path?祝你好运。
  • 最后,find -L /dev/nullX 生成错误消息并将$? 设置为 1。这有帮助吗?祝你好运!

标签: linux unix sh


【解决方案1】:

尝试支持未知平台是没有成效的。仅仅因为你得到了一个非标准方面的权利(例如,用 -follow 替换 -L)并不意味着没有其他你不知道的非标准行为会导致你的脚本中断。

相反,编写您的脚本以默认支持该标准,但提供用户可以明确设置的标志以支持已知旧平台。例如,

if [ "$NON_STANDARD_FIND" = "no-L" ]; then
    find somedir -follow ...
else
    find -L somedir ...
fi

然后运行脚本

my_script ...

NON_STANDRD_FIND=no-L my_script ...

根据需要。

最后,记录您知道可以支持的平台以及如何在这些平台上正确运行脚本。其他平台的用户只应自行承担运行您的脚本的风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多