33

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

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

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

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

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

7 回答 7

42

是在定义您自己@include的选项版本吗?

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

include FILE
于 2012-05-24T12:54:21.630 回答
16

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

FILE=/path/to/some/file && test -f $FILE && source $FILE
于 2012-05-24T11:51:36.950 回答
12

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

source FILE 2> /dev/null
于 2012-05-24T10:39:33.380 回答
4

你可以试试

test -f $FILE && source $FILE

如果返回 false,则不评估test的第二部分&&

于 2012-05-24T10:25:50.447 回答
4

这是我能得到的最短的(文件名加上 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
于 2013-12-02T11:58:07.910 回答
4

如果您想始终获得干净的退出代码,并且无论如何都继续,那么您可以执行以下操作:

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

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

source ~/.bashrc 2> /dev/null || true && echo 'is always executed!'
于 2021-04-04T19:12:22.470 回答
1

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

$ source FILE 2> /dev/null

于 2012-05-24T10:39:37.653 回答