Я установил приложение Ruby, /home/anp/tools
а затем создал символическую ссылку следующим образом:
ln -s /home/anp/tools/wwan /usr/bin/wwan
Если я выполняю ~/tools/wwan
, он работает отлично.
Если я пытаюсь запустить его из символической ссылки, я получаю сообщение об ошибке
невозможно загрузить такой файл -- lib/wwan
Разве это не должно работать как есть? Вызывает ли символическая ссылка проблемы, когда программа пытается разрешить относительные пути к файлам?
решение1
Вызывает ли символическая ссылка проблемы, когда программа пытается разрешить относительные пути к файлам?
Может быть. Скорее всего, в этом случае так и есть.
Вероятный сценарий при запуске ~/tools/wwan
:
- Оболочка расширяется
~
, и вы действительно бежите/home/anp/tools/wwan
. - Инструмент запускается. Он знает, что это так
/home/anp/tools/wwan
(например, из-заargv[0]
). - Инструмент находит часть каталога в приведенной выше строке и изменяет на нее свой рабочий каталог:
/home/anp/tools/
. - Инструмент ссылается на дополнительный актив через относительный путь:
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/
— это системное местоположение для исполняемых файлов. Ссылка оттуда на инструмент, который находится в вашем домашнем каталоге, в целом не является хорошей практикой; то же самое касается и обертывания.- Скрипт-обертка — это отдельный обычный файл. Его владелец и разрешения независимы от владельца и разрешений целевого исполняемого файла. Установите их правильно.