我在/home/http/mywebsite/bin/download.sh中有一个bash脚本
我在/home/http/mywebsite/config/config.yaml
中有一个配置文件现在我想读取yaml文件,无论我在哪里执行脚本。
问题: 当我进入/ home / http / mywebsite / bin /并运行./download.sh时,一切正常。
当我进入/ home /并运行http / mywebsite / bin / download.sh时,由于相对路径,它无法找到配置文件。
无论我在何处执行脚本,如何确保始终可以读取配置文件。它始终位于config / config.yaml
中脚本的4个目录中脚本如下所示:
#!/bin/bash
# This will give me the root directory of my project which is /home/http/mywebsite/
fullpath="$( cd ../"$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cat ${fullpath}config/config.yaml
如果我在脚本所在的目录中执行它,这是有效的。
如果我从其他目录执行脚本,例如/ home /,我会收到以下错误:
cd: ../http/mywebsite/bin: No such file or directory
cat: config/config.yaml: No such file or directory
解?
如果可能的话,使用可以遍历路径N次的代码片段会很好,这可以解决我的问题。但它对我来说太先进了。
例如,您可以将变量“cd_up = 1”设置为多少次。运行循环/ sed或任何魔法。
它会将绝对字符串变为: /家庭/ HTTP / mywebsite /斌/ 成: /家庭/ HTTP / mywebsite /
将其更改为2会将字符串更改为: / home / http /
答案 0 :(得分:2)
通过使用以下方式管理解决它:
#!/bin/bash
cd "$(dirname "$0")"
BASE_DIR=$PWD
# Root directory to the project
ROOT_DIR=${BASE_DIR}/../
cat ${ROOT_DIR}config/config.yaml
这使我无论身在何处都可以执行脚本。
答案 1 :(得分:0)
无论您在何处运行,都可以使用which命令确定执行脚本的绝对路径
BASE_DIR=$(which $0 | xargs dirname)
ROOT_DIR=${BASE_DIR}/../..
cat ${ROOT_DIR}/config/config.yaml
让我们尝试从不同的位置打印路径。
-bash-4.1$ /tmp/dir.sh
$0 - /tmp/dir.sh. Absolute path - /tmp
-bash-4.1$ cd /tmp
-bash-4.1$ ./dir.sh
$0 - ./dir.sh. Absolute path - /tmp
-bash-4.1$
-bash-4.1$ cd /usr/bin
-bash-4.1$ ../../tmp/dir.sh
$0 - ../../tmp/dir.sh. Absolute path - /tmp