【问题标题】:Always get the full path of a relative file in bash始终在 bash 中获取相对文件的完整路径
【发布时间】:2015-07-26 03:48:48
【问题描述】:

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

我在 /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 次的代码 sn-p 会很棒,这将解决我的问题。但是对我来说太高级了。

例如你可以设置一个变量“cd_up=1”上升多少次。运行循环/sed 或任何魔法。

它会将绝对字符串从: /home/http/mywebsite/bin/ 进入: /home/http/mywebsite/

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

【问题讨论】:

  • 这可能与您的问题有点正交,但是您是否考虑过在您的密钥文件所在的位置设置一个环境变量?然后,您可以使用规则,例如当前目录失败该基于 env 的目录。

标签: bash


【解决方案1】:

终于通过以下方式解决了这个问题:

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

这让我无论身在何处都可以执行脚本。

【讨论】:

  • 您的第一行缺少引号:即使$PWD 包含空格,cd "$(dirname "$0")" 也应该是安全的。此外,$PWD`pwd` 快很多。
【解决方案2】:

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

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

【讨论】:

  • $(dirname "$(which "$0")") 会是更好的选择。这里不需要xargs,我们也不想分词。)
  • which 不可移植。有很多实现;原来的 Csh 产生了正确的结果,而不是你的实际 shell。
猜你喜欢
  • 2011-12-11
  • 2015-07-21
  • 2022-12-21
  • 2012-01-02
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多