команда realpath, не найденная

Ну, тривиальное (возможно, обманывающий) путь должно было бы работать:

mysql -NBe "select password('right')"

Это произведет пароль с помощью любой схемы хеширования пароля версия использования mysql. [РЕДАКТИРОВАНИЕ: добавленный-NB, который избавляется от имен столбцов и искусства таблицы ASCII.]

26
13.11.2013, 22:16
4 ответа

Действительно ли realpath является фактической командой или сценарием? Я проверил бы для наблюдения, куда это прибывает из.

$ type -a realpath

Я не знаком с этим инструментом, и таким образом, это вероятно не часть Вашего нормального распределения, возможно, это установлено в нестандартном месте, которое не присутствует на Bash $PATH но в Вашей среде входа в систему $PATH.

В любом случае, вышеупомянутое type команда покажет Вам, куда команда прибывает из, в которой точке можно изменить метод, как который Вы называете ее в своем сценарии так:

echo $(/path/to/realpath test.sh)

Или исправьте свой сценарий $PATH так, чтобы это также включало это нестандартное местоположение.

Функции в оболочке

Большая часть Вашей среды не становится названной при вызове сценария оболочки. Если Вы думаете об этом, это имеет большой смысл, так как Вы обычно не хотите, чтобы сценарии имели весь дополнительный багаж, который может иметь среда пользователя.

Можно или определить, какой исходный файл обеспечивает, эта функция и или получает его или просто дает Bash команду включать среду входа в систему.

#!/bin/bash -l
echo $(realpath "$1")
9
27.01.2020, 19:39
  • 1
    Это - функция, посмотрите редактирование –  Francis 13.11.2013, 22:15
  • 2
    @Francis - да, функции не включены при вызове сценария. Необходимо будет получить их, если Вы захотите, чтобы они пришли. Узнайте, какой файл обеспечивает функцию, и получите его. Если Вы просто хотите свой целый ENV, затем исправляют Ваш вызов для избиения, #!/bin/bash -l. –  slm♦ 13.11.2013, 22:18
  • 3
    Как я могу найти, куда эта функция прибывает из? –  Francis 13.11.2013, 22:19
  • 4
    @mikeserv - спасибо, когда я описал это, я все еще использовал Fedora 14, который не включал realpath. Моя система Fedora 19 действительно теперь включает этот инструмент. Также заметьте, что OP использовал ядро Debian w/2.6, таким образом, его система также будет отсутствовать realpath учитывая его возраст. –  slm♦ 05.05.2014, 05:32
  • 5
    @mikeserv - да я был удивлен, это - староватый Q теперь, но информация о command было все еще полезно для меня. Это - более портативный способ сделать то, что я показывал через оболочки POSIX. –  slm♦ 05.05.2014, 05:38

Существует по крайней мере две названные программы realpath:

  • Старая программа от спины, когда GNU coreutils не включал readlink -f. Это теперь удерживается от использования в пользу readlink -f, столько дистрибутивов прекратило нести его.
  • realpath программа представлена в GNU coreutils 8.15. Это слишком старо, чтобы быть в Debian, сжимают или даже хрипящий; во время записи нестабильный Debian не поставляет его также. Эта программа очень близко к readlink -f.

По некоторым причинам у Вас есть функция оболочки, которая частично эмулирует поведение realpath. Эта эмуляция неравнодушна: при вызове его на символьной ссылке это не переходит по символьной ссылке.

Так как это - функция оболочки, по-видимому, загруженная из или через .bashrc, это только доступно для кодирования выполнения в интерактивной оболочке. Если Вы хотите, чтобы это было доступно другим программам, предположив, что Вы запускаете Linux, создаете сценарий, который эмулирует realpath:

#!/bin/sh
readlink -f -- "$@"

(Это не эмулирует realpathредко используемые параметры командной строки.)

27
27.01.2020, 19:39
  • 1
    я не могу найти доказательство в coreutils мерзавце repo что realpath программу считают удержанной от использования coreutils, или что это не создается по умолчанию. Таким образом, Debian должен удалять его. –  Kaz 27.04.2014, 17:36
  • 2
    @Kaz, О, ну, в общем, просто более того, coreutils недавно (8.15) представил a realpath двоичный файл, который близок, но не точно идентичен readlink -f. Debian стабильные переносы 8.13. Нестабильный Debian принял решение сохранить программу прежней версии. –  Gilles 'SO- stop being evil' 27.04.2014, 20:18
  • 3
    Не случалось так, что недавно - это был Jan 2012. savannah.gnu.org/forum/forum.php?forum_id=7076 –  mikeserv 27.04.2014, 20:27
  • 4
    @mikeserv, Слишком недавний для распределения в вопросе (Debian сжимают). Даже слишком недавний для текущего стабильного Debian. –  Gilles 'SO- stop being evil' 27.04.2014, 20:29
  • 5
    Это довольно страшно. Какого возраста их openssl? –  mikeserv 27.04.2014, 20:30

Это работает только в shell, потому что файл сценария имеет другую область видимости и не имеет доступа к вашим локальным функциям и псевдонимам, определенным в ваших rc файлах. А команда realpath фактически не существует в вашей системе.

Поэтому либо установите realpath из пакета, определите свою собственную функцию (как часть скрипта, проверьте некоторые примеры), либо найдите файл rc в вашем скрипте, где она определена (например, . ~/.bashrc).


Вот шаги для установки realpath, если его нет:

  • Ubuntu: sudo apt-get install coreutils
  • OS X: brew install coreutils

Ubuntu и Debian

На Debian или Ubuntu, похоже, realpath должен быть установлен по умолчанию. Я проверил в недавнем Debian 8 (Jessie) и, кажется, coreutils установлен по умолчанию.

Проверено с помощью свежих образов VM:

$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh

Затем в VM:

$ type -a realpath
realpath is /usr/bin/realpath

Вместо realpath вы также можете использовать readlink -f file (или greadlink), предоставляемый пакетом coreutils.

8
27.01.2020, 19:39
$ sudo apt-get install realpath
5
27.01.2020, 19:39

Теги

Похожие вопросы