问题
当前接受的答案仅在重要条件下有效。鉴于...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
和
/foo/bar/second.sh
:
#!/bin/bash
source ./first.sh
func1 World
仅当first.sh
从 所在的同一目录中执行时才有效first.sh
。IE。如果当前shell的工作路径是/foo
,尝试运行命令
cd /foo
./bar/second.sh
打印错误:
/foo/bar/second.sh: line 4: func1: command not found
那是因为source ./first.sh
是相对于当前工作路径的,而不是脚本的路径。因此,一种解决方案可能是利用 subshell 并运行
(cd /foo/bar; ./second.sh)
更通用的解决方案
鉴于...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
和
/foo/bar/second.sh
:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
然后
cd /foo
./bar/second.sh
印刷
Hello World
这个怎么运作
$0
返回执行脚本的相对或绝对路径
dirname
返回目录的相对路径,其中 $0 脚本存在
$( dirname "$0" )
该dirname "$0"
命令返回执行脚本目录的相对路径,然后将其用作source
命令的参数
- 在 "second.sh" 中,
/first.sh
只是附加了导入的 shell 脚本的名称
source
将指定文件的内容加载到当前 shell