如何在bash shell脚本中包含文件


121

有没有办法在外壳程序脚本中包含另一个外壳程序脚本,以便能够访问其功能?

就像在PHP中一样,您可以将include指令与其他PHP文件一起使用,以便仅通过调用函数名称即可运行其中包含的函数。



@Troubadour感谢您的参考。即使帖子引用了source命令,问题本身还是在询问如何查明source文件的位置。
Mechaflash

1
“基本问题”是堆栈溢出的催化剂。您了解该站点像其他站点一样被索引,现在,“如何在bash shell脚本中包括文件”将显示在Google链接上,从而导致堆栈溢出,从而增加了站点访问量和曝光率。= D
Mechaflash 2012年

3
你真聪明!谢谢你的给力!
Mechaflash'6

4
@Troubadour,评论我应该用谷歌搜索答案是愚蠢的,而这正是我到达页面的方式。例如,今天这个特定的问题是Google对“ bash包含文件”的最高评价。我是否应该跳过此答案以找到其他解决方案?
lwitzel

Answers:


192

只需将您的脚本内:

source FILE

要么

. FILE # POSIX compliant

$ LANG=C help source
source: source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.

17
注意 。是POSIX兼容,而源不兼容
Mathieu_Du 2015年

但是这里的来源与我们在C语言中所包含的并不完全相同。在这里,源代码将子脚本执行到主脚本中。如果我只想从子脚本中调用特定功能怎么办?
Paresh Mayani

8
不要. script.sh与混淆./script.sh。我花了几个小时试图弄清楚发生了什么
Tihomir Mitkov

一会儿。是POSIX兼容的,这意味着它将在sh,dash,zsh和其他POSIX shell上运行。最好使用。因为某些外壳具有自己的相似但相似的“源”版本,可能会破坏您的应用程序。
雅各布·科尔巴

51

上面的答案是正确的,但是如果在其他文件夹中运行脚本,则会出现一些问题。

例如,a.shb.sh在同一文件夹中,包含b与 . ./b.sh要包含。

在文件夹之外运行脚本时(例如使用)xx/xx/xx/a.shb.sh找不到文件:./b.sh: No such file or directory

我用

. $(dirname "$0")/b.sh


2

在我的情况下,为了包含color.sh来自的相同目录init.sh,我必须执行以下操作。

. ./color.sh

不知道为什么./而不color.sh直接。的内容color.sh如下。

RED=`tput setaf 1`
GREEN=`tput setaf 2`
BLUE=`tput setaf 4`
BOLD=`tput bold`
RESET=`tput sgr0`

使用File color.sh不会出错,但是颜色不会显示。我已经对此进行Ubuntu 18.04了测试,Bash版本为:

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)


这只会在当前工作目录中提供文件,而不是当前目录中的文件init.sh(如果首先启动它们,它们就会重合./init.sh)。
ricab

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.