总是在bash中获取相关文件的完整路径

我有一个位于/home/http/mywebsite/bin/download.sh的bash脚本

我在/home/http/mywebsite/config/config.yaml中有一个配置文件

现在我想阅读yaml文件,无论我在哪里执行我的脚本。

问题:当我cd到/ home / http / mywebsite / bin /并运行./download.sh时,一切正常。

当我cd到/ 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或任何魔法。

它会将绝对字符串从/ home / http / mywebsite / bin /转换为:/ home / http / mywebsite /

并将其更改为2它会将字符串更改为:/ home / http /


最终通过使用以下方法来解决它:

#!/bin/bash
cd "$(dirname "$0")"
BASE_DIR=$PWD
# Root directory to the project
ROOT_DIR=${BASE_DIR}/../
cat ${ROOT_DIR}config/config.yaml

这使我无论在哪里都可以执行脚本。


无论您在哪里运行,您都可以使用哪个命令来确定执行脚本的绝对路径

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
链接地址: http://www.djcxy.com/p/9739.html

上一篇: Always get the full path of a relative file in bash

下一篇: How to get full path of a file?