Bash环境
给出如下非常简单的磁盘结构
将环境路径变量设置为dir1和dir2如下
$ env|grep PATH
returns :-
PATH=/:/usr/bin:/e/path/to/directory/dir1:/e/path/to/directory/dir2
程序执行失败,如下所示
$ bin/prog.exe
bash: bin/prog1.exe: No such file or directory
或者也是
$ /bin/prog1.exe
bash: /bin/prog.exe: No such file or directory
但是,如果我们修改路径以包含/ bin
PATH=/:/usr/bin:/e/path/to/directory/dir1/bin:/e/path/to/directory/dir2/bin
它当然可以工作
$ prog1.exe
Hello from prog1 ...
我的问题是我如何在bash中创建相对于“环境” PATH的路径?
在实践中,我得到了一些文件,这些文件具有生成到许多不同虚拟根目录位置的10的相对路径,我无法对其进行更改。
在这种情况下,也无法使用完整路径或仅使用可执行文件名(我们知道有效)。
答案 0 :(得分:3)
有关说明,请参见man bash
(强调我的意思):
如果该名称既不是shell函数也不是内置函数,并且不包含斜杠,则bash会在PATH的每个元素中搜索包含该名称的可执行文件的目录。
答案 1 :(得分:2)
正如@choroba所暗示的,您不能做您想做的事情。
如果您需要在PATH条目之一的子目录中找到程序,则必须迭代直到找到它:
rel_path="bin/prog.exe"
IFS=: read -ra paths <<<"$PATH"
for path in "${paths[@]}"; do
if [[ -x "$path/$rel_path" ]]; then
exe="$path/$rel_path"
break
fi
done
if [[ -z "$exe" ]]; then
echo "cannot find $rel_path"
else
echo "found $rel_path as $exe"
fi
答案 2 :(得分:2)
没有相对路径查找之类的东西。如果您的命令名称包含任何/
字符,则仅将其视为相对于当前工作目录的路径。如果没有/
字符,则外壳程序将仅在PATH
中列出的确切目录中查找,而不会在其下的任何子目录中查找。
相对路径查找会引发与搜索子目录顺序有关的许多问题。