2

编写一个将访问与其相关的文件的 shell 脚本的最佳方法是什么,这样我从哪里调用它并不重要?“简单”是指可以跨不同系统/外壳工作的最简单/推荐的方式。

例子

假设我有一个~/MyProject包含子文件夹scripts/files/. 在scripts/,我有一个foo.sh想要访问文件的 shell 脚本files/

if [ -f "../files/somefile.ext" ]; then
    echo "File found"
else
    echo "File not found"
fi

如果我这样做,它会正常工作cd ~/MyProject/scripts && ./foo.sh,但它会失败cd ~/MyProject && scripts/foo.sh

4

6 回答 6

3

你通常可以这样做:

mydir="$(dirname $0)"

获取运行脚本的目录。

然后只需使用它来查找您的文件。

于 2013-08-24T22:17:51.827 回答
1

使所有路径成为绝对路径。尽可能使用环境变量,例如 $HOME。您遇到了 UNIX 脚本的弱点。

使用 .profile 或 .bash_profile,您的开发人员可以设置一堆 ENV 变量。然后您的脚本可以利用这些变量。

在我工作的一个地方,你可以运行一个脚本,它会提示你想要查看哪个版本,并设置 ENV,使开发人员的交互非常无缝。

于 2013-08-24T22:15:08.307 回答
0

不幸的是,似乎没有一个真正通用的解决方案。我个人的建议(和实践)是只为提供对 this 的一致访问的 shell 编写——recent ksh93's ${.sh.file}bash's$BASH_SOURCE等。(我不知道zsh解决方案,但我确信有一个。)

除此之外,最好的解决方案是以某种方式避免问题;例如,对于 git 存储库中的脚本示例,您可以要求从它所在的目录调用该脚本。通过选中 验证该脚本后[[ -e myscript ]],您可以预期相对链接将按预期工作。(是的,为了完全的健壮性,您需要将脚本的基本名称硬编码到测试中,这与这个问题首先存在的原因相同——它在所有可能的情况下都可用于 shell。)

于 2014-06-04T21:44:16.123 回答
0

不确定这对您来说是否足够容易,但这可以为您提供解决方案:

Shell 脚本加载器

于 2013-08-24T22:14:16.173 回答
0
if [ -f "../files/somefile.ext"]
then
  echo "file was found"
else
  echo "file was not found"
fi

第二:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi
于 2013-08-24T22:21:08.107 回答
0

考虑到它$0应该包含执行脚本的路径,您可以简单地 cd 到它然后正常处理

所以你只需做

scriptDir=$(dirname -- "$0")
cd -- "$scriptDir"

但这仍然是一个技巧,您可能应该考虑一种使用绝对路径的方法

于 2013-08-24T22:28:35.900 回答