我刚刚遇到redis install_server script中的错误 它有一个硬编码:
DEFAULT_CONFIG="../redis.conf"
所以当运行此脚本时,不是从它自己的文件夹(例如./utils/install_server.sh) 脚本无法找到conf文件。
我正在寻找一种引用脚本文件夹的方法,而不依赖于调用脚本的位置。
我查看了this answer这似乎是关于SO的规范,但有些事情对我来说是失败的:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $DIR
我得到了:
./ utils / install_server.sh:100:./utils/install_server.sh:糟糕的替换 /home/myusername/binaries/redis-2.8.3 #where我从我需要的文件夹运行脚本
所以我猜我做错了,或者这不是我的正确答案
我知道我可以添加一个检查文件是否存在以及redis安装脚本的更清晰的错误消息,但我只是让它工作。
我会为这些想法感到高兴,并且我会为了解决这个问题而为了每个人制作一个公关版本。
谢谢!
答案 0 :(得分:2)
我做的事与你发布的非常相似:
SCRIPT_DIR="$(cd $(dirname $0) && pwd)"
在您的情况下,似乎BASH_SOURCE出了问题。在我的方法中,我使用$ 0,它总是计算用于启动脚本的完整路径名。
我不确定您的脚本中BASH_SOURCE的问题是什么,因为您发布的内容适用于我。因此,我只是提供另一种方法。
答案 1 :(得分:1)
您是使用bash运行此功能(即使用#!/bin/bash
启动脚本还是使用bash /path/to/script
运行脚本),还是使用普通sh(#!/bin/sh
或sh /path/to/script
)? BASH_SOURCE
和数组([0]
)都是bash扩展,并且可能在通用shell中不可用。特别是,“错误替换”错误是我在尝试在不支持它们的shell中使用数组时看到的错误。