通常包含脚本的方式是“源”
例如:
main.sh:
#!/bin/bash
source incl.sh
echo "The main script"
incl.sh:
echo "The included script"
执行“./main.sh”的输出是:
The included script
The main script
...现在,如果您尝试从其他位置执行该shell脚本,除非它在您的路径中,否则无法找到包含。
确保脚本可以找到包含脚本的好方法是什么,特别是如果脚本需要可移植?
#1楼
我知道我迟到了,但无论你如何启动脚本并专门使用内置函数,这都应该有效:
DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. "$DIR/incl.sh"
. "$DIR/main.sh"
.
(dot)命令是source的别名, $PWD
是工作目录的路径, BASH_SOURCE
是一个数组变量,其成员是源文件名, ${string%substring}
从$ string后面BASH_SOURCE
$ substring的最短匹配
#2楼
使用source或$ 0不会为您提供脚本的真实路径。 您可以使用脚本的进程ID来检索其真实路径
ls -l /proc/$$/fd |
grep "255 ->" |
sed -e 's/^.\+-> //'
我正在使用这个脚本,它一直很好地服务于我:)
#3楼
我倾向于使我的脚本彼此相对。 那样我就可以使用dirname:
#!/bin/sh
my_dir="$(dirname "$0")"
"$my_dir/other_script.sh"
#4楼
如果它在同一目录中,则可以使用dirname $0
:
#!/bin/bash
source $(dirname $0)/incl.sh
echo "The main script"
#5楼
我建议你创建一个setenv脚本,其唯一目的是为整个系统中的各种组件提供位置。
然后,所有其他脚本将获取此脚本,以便使用setenv脚本在所有脚本中使用所有位置。
这在运行cronjobs时非常有用。 在运行cron时,您获得了最小的环境,但如果您首先使所有cron脚本都包含setenv脚本,那么您就可以控制和同步您希望cronjobs执行的环境。
我们在构建猴子上使用了这种技术,用于在大约2,000 kSLOC的项目中进行持续集成。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3190686