3

Я сделал символическую ссылку на исполняемый файл с

ln -s /usr/bin/mydir/myexec /usr/bin/myexec

Когда я выполняю myexec в Bash, он не загружает нужные файлы, которые находятся в исходном myexec .

Почему это происходит и как я могу это решить? Я на Fedora 15 х64.

2 ответа2

3

Файлы, которые вызываются с относительными путями в /usr/bin/mydir/myexec будут искать относительно текущего рабочего каталога, из которого выполняется скрипт. Вероятно, ваш скрипт в настоящее время работает, только если он выполняется из /usr/bin/mydir в данный момент.

Одним из способов решения этой проблемы является предоставление абсолютных путей к включаемым файлам (но затем необходимо обновить скрипт, если требуемые файлы когда-либо перемещаются), или вам нужно определить абсолютный путь динамически с помощью readlink , например

THISFILE=$(readlink -f -- "${0}")
THISDIR=${THISFILE%/*}
. "${THISDIR}/my_settings_file"
  • readlink -f вернет цель символической ссылки.
  • ${THISFILE%/*} вернет цель символической ссылки с частью, включающей и после последней / удаленной, т.е. путь к рассматриваемому файлу.
  • ${THISDIR} теперь содержит абсолютный путь к файлу и может использоваться как в строке 3.

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


Другой способ решить эту проблему, который более или менее полно решает проблему, состоит в том, чтобы вместо символической ссылки двоичного файла на вашем пути создать небольшой скрипт в /usr/bin/myexec который содержит, например,

#!/bin/sh
cd /usr/bin/mydir
./myexec
1

Я не согласен с @ Дэниел-Андерсон. Я не думаю, что эти решения должным образом учитывают аргументы вызываемой программы. Почти все исполняемые файлы обрабатывают аргументы пути относительно текущего каталога, поэтому даже передача аргументов через них не сработает.

Единственный случай, когда программа будет вести себя иначе, если она вызывается из symlink - это если она проверяет 0-й аргумент. Я не знаю способа обойти это, используя символическую ссылку. Простейший обходной путь - создание промежуточного сценария оболочки в виде:

#!/bin/sh
/path/to/executable/that/needs/0th/argument/to/be/actual/path $@

Обратите внимание, что если по какой-то причудливой причине вам нужно дать ему 0-й аргумент, который на самом деле не там, где он есть, вы можете использовать exec -a следующим образом:

#!/bin/bash
(exec -a /path/to/executable/to/fool /path/to/fool/executable/with $@)

Обратите внимание, что аргумент "-a" может не соответствовать спецификации POSIX, поэтому я использовал bash специально. Предполагая, что в вашем пути есть папка ~/bin, первый (нормальный) случай может быть быстро выполнен следующим образом:

echo -e '#!/bin/sh\n/path/to/executable $@' > ~/bin/shortcut
chmod 755 ~/bin/shortcut
shortcut

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .