У меня есть Debian Squeeze AMD64. Моя текущая оболочка bash. Если я пишу следующее в моем терминале, это работает:
$ uname -a
Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $SHELL
/bin/bash
$ echo $(realpath test.sh)
/home/ffortier/test.sh
Мой файл test.sh выглядит так:
#!/bin/bash
echo $(realpath "$1")
Если я пытаюсь выполнить следующее, я получаю ошибку
$ ./test.sh test.sh
./test.sh: line 2: realpath: command not found
Как я могу использовать команду realpath в файле bash?
Дополнительная информация
$ type -a realpath
realpath is a function
realpath ()
{
f=$@;
if [ -d "$f" ]; then
base="";
dir="$f";
else
base="/$(basename "$f")";
dir=$(dirname "$f");
fi;
dir=$(cd "$dir" && /bin/pwd);
echo "$dir$base"
}
#!/bin/bash -l
.realpath
. Моя система Fedora 19 теперь включает этот инструмент. Также обратите внимание, что OP использовал ядро Debian w / 2.6, поэтому его система тоже не работала бы,realpath
учитывая его возраст.command
была все еще полезна для меня. Это более портативный способ сделать то, что я показывал в оболочках POSIX.Есть как минимум две программы
realpath
:readlink -f
. Сейчас это устарело в пользуreadlink -f
, поэтому многие дистрибутивы перестали его переносить.realpath
Программа введена в GNU Coreutils 8.15. Это слишком старо, чтобы быть в Debian squeeze или даже wheezy; на момент написания Debian нестабильный также не поставляется . Эта программа очень близка кreadlink -f
.По какой-то причине у вас есть функция оболочки, которая частично эмулирует поведение
realpath
. Эта эмуляция является частичной: если вы вызываете ее по символической ссылке, она не следует по символической ссылке.Поскольку это функция оболочки, предположительно загруженная из или через
.bashrc
нее, она доступна только для кода, выполняемого в вашей интерактивной оболочке. Если вы хотите, чтобы он был доступен для других программ, предполагая, что вы работаете в Linux, создайте скрипт, который эмулируетrealpath
:(Это не эмулирует
realpath
редко используемые параметры командной строки.)источник
realpath
считает программу устаревшей или что она не создана по умолчанию. Таким образом, Debian должен удалить его.realpath
двоичный файл, который близок, но не совсем идентиченreadlink -f
. Стабильная версия Debian 8.13. Debian нестабильный решил оставить прежнюю программу .openssl
?Он работает только в оболочке, потому что файл сценария имеет другую область видимости и не имеет доступа к вашим локальным функциям и псевдонимам, определенным в ваших файлах rc . И
realpath
команда на самом деле не существует в вашей системе.Так что либо установите
realpath
из пакета, определите свою собственную функцию (как часть сценария, проверьте несколько примеров ), либо поставьте rc- файл в свой сценарий, где он определен (например. ~/.bashrc
).Вот шаги, чтобы установить,
realpath
если это не присутствует:sudo apt-get install coreutils
brew install coreutils
Ubuntu & Debian
В Debian или Ubuntu кажется, что
realpath
должен быть установлен по умолчанию. Я проверил последний Debian 8 (Jessie), и он, кажется,coreutils
установлен по умолчанию.Протестировано с использованием свежих образов виртуальных машин:
Тогда в ВМ:
Вместо этого
realpath
вы также можете использоватьreadlink -f file
(илиgreadlink
) предоставляемыйcoreutils
пакет.источник
источник