Выполнить программу с относительным путем и средой PATH в оболочке Bash - PullRequest
0 голосов
/ 19 сентября 2018

Среда 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 ...

Мой вопрос: как сделать так, чтобы пути относительно «окружения» PATH работали в bash?

ВНа практике мне дают несколько файлов с 10-ю относительными путями, сгенерированными для множества различных виртуальных корневых расположений, которые я не могу изменить.

Также невозможно использовать полный путь или только имя исполняемого файла (который мы знаем работает) для этого сценария.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Как подразумевает @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
0 голосов
/ 19 сентября 2018

Нет такой вещи, как поиск относительного пути.Если имя вашей команды содержит символы /, оно рассматривается как путь относительно вашего текущего рабочего каталога.Если у него нет символов /, то оболочка будет искать только в точных каталогах, а не в любых подкаталогах под ними, перечисленных в ваших PATH.

При поиске относительного пути возникнет множество проблем, связанных спорядок, в котором следует искать подкаталоги.

0 голосов
/ 19 сентября 2018

См. man bash для объяснения (выделено мной):

Если имя не является ни функцией оболочки, ни встроенным, а не содержит слешей , bash ищет каждый элементPATH для каталога, содержащего исполняемый файл с таким именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...