【问题标题】:What is the most concise way to source a file (only if it exists) in Bash?在 Bash 中获取文件(仅当它存在时)的最简洁方法是什么?
【发布时间】:2012-05-24 10:21:57
【问题描述】:

在 Bash 脚本中,是否有一个单独的语句替代方案?

if [ -f /path/to/some/file ]; then
    source /path/to/some/file
fi

最重要的是文件名只存在一次,而不是使其成为变量(这会增加更多行)。

例如,在 PHP 中你可以这样做

@include("/path/to/some/file"); // @ makes it ignore errors

【问题讨论】:

标签: bash error-handling include


【解决方案1】:

是否可以定义您自己的@include 版本?

include () {
    [[ -f "$1" ]] && source "$1"
}

include FILE

【讨论】:

  • 如果源脚本引用其位置参数,这将无法按预期工作。见this question。我想知道为什么 8 年来没有人指出这一点。
  • 你的意思是include FILE a b c之类的东西是否等同于source FILE a b c
  • 我不明白你认为第一个参数会如何加倍,除非你写的是source "$1" "$@"。至于我为什么不使用"$@",对于原来的问题来说根本没有必要。
  • 这就是我想说的:https://repl.it/repls/LightblueTriangularLoopfusion(在线编辑)
  • 没关系。不过,它与这个问题并没有太大关系,它从未提到任何需要将参数传递给要获取的文件。
【解决方案2】:

如果您担心单行而不重复文件名,也许:

FILE=/path/to/some/file && test -f $FILE && source $FILE

【讨论】:

  • 如果set -ex 的设置超出您的控制范围(例如在构建环境中),这就是您想要的答案。
【解决方案3】:

如果您担心警告(并且缺少源文件对您的脚本来说并不重要),只需摆脱警告:

source FILE 2> /dev/null

【讨论】:

  • 该文件是可选的,因此缺少它是意料之中的,但这不会也丢弃包含的脚本生成的任何输出吗?
  • @BartvanHeukelom:是的,但它只会丢弃脚本发送到标准 error 的任何输出。脚本发送到标准输出的任何输出都可以正常通过。
【解决方案4】:

你可以试试

test -f $FILE && source $FILE

如果 test 返回 false,则不计算 && 的第二部分

【讨论】:

  • 稍微好一点,但我宁愿只使用一次 $FILE(更新问题)
  • 既然是变量,它的值会是一致的,我觉得你不用管它
  • 就是这样,不一定是变量
  • 您可以将名称分配给变量,然后将问题简化为我的答案是解决方案的问题(这样您就不会重复文件名)
【解决方案5】:

这是我能得到的最短的(文件名加上 20 个字符):

F=/path/to/some/file;[ -f $F ] && . $F

相当于:

F=/path/to/some/file 
test -f $F && source $F

为了提高可读性,我更喜欢这种形式:

FILE=/path/to/some/file ; [ -f $FILE ] && . $FILE

【讨论】:

    【解决方案6】:

    如果您想始终获得干净的退出代码,并且无论如何都继续,那么您可以这样做:

    source ~/.bashrc || true && echo 'is always executed!'
    

    如果您还想摆脱错误消息,那么:

    source ~/.bashrc 2> /dev/null || true && echo 'is always executed!'
    

    【讨论】:

      【解决方案7】:

      如果您不关心脚本的输出,您可以将标准错误重定向到/dev/null,如下所示:

      $ source FILE 2> /dev/null

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-10
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 2014-04-19
        相关资源
        最近更新 更多