Mam debian squeeze amd64. Moja obecna powłoka to bash. Jeśli napiszę w moim terminalu, to działa:
$ 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
Mój plik test.sh wygląda następująco:
#!/bin/bash
echo $(realpath "$1")
Jeśli spróbuję wykonać następujące czynności, pojawia się błąd
$ ./test.sh test.sh
./test.sh: line 2: realpath: command not found
Jak mogę użyć polecenia realpath w pliku bash?
Dodatkowe informacje
$ 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
. Mój system Fedora 19 zawiera teraz to narzędzie. Zauważ też, że OP używa jądra Debian w / 2.6, więc jego systemu też by brakowało,realpath
biorąc pod uwagę jego wiek.command
były dla mnie przydatne. To bardziej przenośny sposób na robienie tego, co pokazywałem w powłokach POSIX.Istnieją co najmniej dwa programy o nazwie
realpath
:readlink -f
. Jest teraz przestarzałe na korzyśćreadlink -f
, więc wiele dystrybucji przestało go nosić.realpath
Program wprowadzony w GNU Coreutils 8.15. Jest to za stary, aby można go było ściskać w Debianie, a nawet świst; podczas pisania Debian niestabilny też go nie wysyła . Ten program jest bardzo bliskoreadlink -f
.Z jakiegoś powodu masz funkcję powłoki, która częściowo emuluje zachowanie
realpath
. Ta emulacja jest częściowa: jeśli wywołasz ją na dowiązaniu symbolicznym, nie będzie ona podążać za dowiązaniem symbolicznym.Ponieważ jest to funkcja powłoki, prawdopodobnie załadowana z lub przez
.bashrc
, jest dostępna tylko dla kodu działającego w interaktywnej powłoce. Jeśli chcesz, aby był dostępny dla innych programów, zakładając, że używasz Linuksa, utwórz skrypt emulującyrealpath
:(To nie emuluje
realpath
rzadko używanych opcji wiersza poleceń.)źródło
realpath
program jest uważany za przestarzały przez coreutils lub że nie jest zbudowany domyślnie. Więc Debian musi go usuwać.realpath
binarny, który jest bliski, ale nie do końca identycznyreadlink -f
. Stabilna Debiana przenosi 8.13. Niestabilny Debian zdecydował się zachować starszy program .openssl
?Działa tylko w powłoce, ponieważ plik skryptu ma inny zasięg i nie ma dostępu do lokalnych funkcji i aliasów zdefiniowanych w plikach rc . A
realpath
polecenie faktycznie nie istnieje w twoim systemie.Więc zainstaluj
realpath
z pakietu, zdefiniuj własną funkcję (jako część skryptu, sprawdź kilka przykładów ) lub źródłowy plik rc w skrypcie, w którym jest zdefiniowany (np. ~/.bashrc
.).Oto kroki, które należy zainstalować,
realpath
jeśli go nie ma:sudo apt-get install coreutils
brew install coreutils
Ubuntu i Debian
Na Debianie lub Ubuntu wydaje się, że
realpath
powinna być instalowana domyślnie. Sprawdziłem najnowszą wersję Debian 8 (Jessie) i wygląda na to, że zostałacoreutils
domyślnie zainstalowana.Testowane przy użyciu świeżych obrazów maszyn wirtualnych:
Następnie w maszynie wirtualnej:
Zamiast tego
realpath
możesz również użyćreadlink -f file
(lubgreadlink
) dostarczonego przezcoreutils
pakiet.źródło
źródło