一般包含脚本的方式是“源” shell
例如: 数组
main.sh: bash
#!/bin/bash source incl.sh echo "The main script"
incl.sh: 函数
echo "The included script"
执行“./main.sh”的输出是: spa
The included script The main script
...如今,若是您尝试从其余位置执行该shell脚本,除非它在您的路径中,不然没法找到包含。 code
确保脚本能够找到包含脚本的好方法是什么,特别是若是脚本须要可移植? 进程
我知道我迟到了,但不管你如何启动脚本并专门使用内置函数,这都应该有效: ip
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的最短匹配 同步
使用source或$ 0不会为您提供脚本的真实路径。 您可使用脚本的进程ID来检索其真实路径 string
ls -l /proc/$$/fd | grep "255 ->" | sed -e 's/^.\+-> //'
我正在使用这个脚本,它一直很好地服务于我:)
我倾向于使个人脚本彼此相对。 那样我就可使用dirname:
#!/bin/sh my_dir="$(dirname "$0")" "$my_dir/other_script.sh"
若是它在同一目录中,则可使用dirname $0
:
#!/bin/bash source $(dirname $0)/incl.sh echo "The main script"
我建议你建立一个setenv脚本,其惟一目的是为整个系统中的各类组件提供位置。
而后,全部其余脚本将获取此脚本,以便使用setenv脚本在全部脚本中使用全部位置。
这在运行cronjobs时很是有用。 在运行cron时,您得到了最小的环境,但若是您首先使全部cron脚本都包含setenv脚本,那么您就能够控制和同步您但愿cronjobs执行的环境。
咱们在构建猴子上使用了这种技术,用于在大约2,000 kSLOC的项目中进行持续集成。