Программа запускается при прямом доступе, но не при доступе через символическую ссылку.

Программа запускается при прямом доступе, но не при доступе через символическую ссылку.

Я установил приложение Ruby, /home/anp/toolsа затем создал символическую ссылку следующим образом:

ln -s /home/anp/tools/wwan /usr/bin/wwan

Если я выполняю ~/tools/wwan, он работает отлично.
Если я пытаюсь запустить его из символической ссылки, я получаю сообщение об ошибке

невозможно загрузить такой файл -- lib/wwan

Разве это не должно работать как есть? Вызывает ли символическая ссылка проблемы, когда программа пытается разрешить относительные пути к файлам?

решение1

Вызывает ли символическая ссылка проблемы, когда программа пытается разрешить относительные пути к файлам?

Может быть. Скорее всего, в этом случае так и есть.

Вероятный сценарий при запуске ~/tools/wwan:

  1. Оболочка расширяется ~, и вы действительно бежите /home/anp/tools/wwan.
  2. Инструмент запускается. Он знает, что это так /home/anp/tools/wwan(например, из-заargv[0]).
  3. Инструмент находит часть каталога в приведенной выше строке и изменяет на нее свой рабочий каталог: /home/anp/tools/.
  4. Инструмент ссылается на дополнительный актив через относительный путь: lib/wwan. Актив действительно находится в /home/anp/tools/lib/wwan, поэтому он работает.

Но когда вы запускаете /usr/bin/wwanили wwan/usr/binнахождением в $PATH), сценарий начинается с /usr/bin/wwanи заканчивается на /usr/bin/lib/wwanкоторый не существует как файл. Актива там нет.

Детали могут различаться, но такая проблема с символической ссылкой указывает на то, что инструмент не разыменовывает ссылку, когда это необходимо. Если бы он это делал, он бы всегда работал так, /home/anp/tools/wwanкак если бы вы запускали /home/anp/tools/wwan. Я бы сказал, что то, что вы испытали, — это ошибка.

Один из способов решения этой проблемы — усовершенствовать сам инструмент (отредактировать его код), чтобы он правильно находил свой реальный путь.

Другой способ — использовать скрипт-обертку вместо символической ссылки. Удалите символическую ссылку и создайте скрипт под именем /usr/bin/wwan. Содержимое скрипта:

#!/bin/sh
exec /home/anp/tools/wwan "$@"

Сделайте его исполняемым. Теперь, если вы вызовете /usr/bin/wwan, скрипт будет execи /home/anp/tools/wwanэто будет строка, с которой будет работать инструмент, так что это должно работать. Все (ноль или более) аргументов, которые вы предоставите для , /usr/bin/wwanбудут переданы /home/anp/tools/wwanблагодаря "$@".

Примечания:

  • /usr/bin/— это системное местоположение для исполняемых файлов. Ссылка оттуда на инструмент, который находится в вашем домашнем каталоге, в целом не является хорошей практикой; то же самое касается и обертывания.
  • Скрипт-обертка — это отдельный обычный файл. Его владелец и разрешения независимы от владельца и разрешений целевого исполняемого файла. Установите их правильно.

Связанный контент