Existují alespoň dva programy s názvem realpath
:
- Starý program z doby, kdy GNU coreutils neobsahoval
readlink -f
. Nyní je zastaralá ve prospěchreadlink -f
, tolik distribucí jej přestalo nosit. realpath
program představený v GNU coreutils 8.15. Toto je příliš staré na to, aby bylo v Debianu squeeze nebo dokonce sípavé; v době psaní tohoto článku jej Debian unstable také nedodává. Tento program je velmi blízkýreadlink -f
.
Z nějakého důvodu máte funkci shellu, která částečně emuluje chování realpath
. Tato emulace je částečná:pokud ji zavoláte na symbolický odkaz, nenásleduje symbolický odkaz.
Protože se jedná o shellovou funkci, pravděpodobně načtenou z nebo přes .bashrc
, je k dispozici pouze pro kód běžící ve vašem interaktivním shellu. Pokud chcete, aby byl dostupný pro jiné programy, za předpokladu, že používáte Linux, vytvořte skript, který emuluje realpath
:
#!/bin/sh
readlink -f -- "[email protected]"
(Toto neemuluje realpath
zřídka používané možnosti příkazového řádku.)
Funguje pouze v prostředí shell, protože soubor skriptu má jiný rozsah a nemá přístup k vašim lokálním funkcím a aliasům definovaným ve vašem rc soubory. A realpath
příkaz ve vašem systému ve skutečnosti neexistuje.
Takže buď nainstalujte realpath
z balíčku, definujte svou vlastní funkci (jako součást skriptu, zkontrolujte některé příklady) nebo vytvořte zdroj rc soubor ve vašem skriptu, kde je definován (např. . ~/.bashrc
).
Zde jsou kroky k instalaci realpath
pokud není přítomen:
- Ubuntu:
sudo apt-get install coreutils
- OS X:
brew install coreutils
Ubuntu a Debian
Na Debianu nebo Ubuntu to vypadá jako realpath
by měl být nainstalován ve výchozím nastavení. Zkontroloval jsem nedávný Debian 8 (Jessie) a zdá se, že má coreutils
ve výchozím nastavení nainstalováno.
Testováno pomocí čerstvých obrazů virtuálních počítačů:
$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
Poté ve VM:
$ type -a realpath
realpath is /usr/bin/realpath
Místo realpath
, můžete také použít readlink -f file
(nebo greadlink
) poskytuje coreutils
balíček také.
Je realpath skutečný příkaz nebo skript? Zkontroloval bych, odkud pochází.
$ type -a realpath
Tento nástroj neznám, a proto pravděpodobně není součástí vaší normální distribuce, možná je nainstalován v nestandardním umístění, které není přítomno na $PATH
Bash ale je v rámci vašeho přihlašovacího prostředí $PATH
.
V každém případě výše uvedené type
příkaz vám ukáže, odkud příkaz pochází, v tomto okamžiku můžete změnit metodu, kterou jej voláte ve skriptu takto:
echo $(/path/to/realpath test.sh)
Nebo upravte $PATH
svého skriptu tak, aby zahrnoval i toto nestandardní umístění.
Funkce v shellu
Velká část vašeho prostředí se nezavolá, když vyvoláte skript shellu. Pokud se nad tím zamyslíte, dává to velký smysl, protože obecně nechcete, aby skripty měly všechna další zavazadla, která může mít uživatelské prostředí.
Můžete buď určit, který zdrojový soubor poskytuje tuto funkci, a buď jej získat jako zdroj, nebo jednoduše instruovat Bash, aby začlenil vaše přihlašovací prostředí.
#!/bin/bash -l
echo $(realpath "$1")