在Bash Shell中使用相对路径和'PATH'环境执行程序

时间:2018-09-19 13:39:55

标签: bash mingw

Bash环境

给出如下非常简单的磁盘结构

Simple File Structure

将环境路径变量设置为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的相对路径,我无法对其进行更改。

在这种情况下,也无法使用完整路径或仅使用可执行文件名(我们知道有效)。

3 个答案:

答案 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中列出的确切目录中查找,而不会在其下的任何子目录中查找。

相对路径查找会引发与搜索子目录顺序有关的许多问题。