始终在bash中获取相关文件的完整路径

时间:2015-07-26 03:48:48

标签: bash

我在/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 /

2 个答案:

答案 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