Ci sono almeno due programmi chiamati realpath
:
- Un vecchio programma di quando GNU coreutils non includeva
readlink -f
. Ora è deprecato a favore direadlink -f
, così tante distribuzioni hanno smesso di portarlo. - Il
realpath
programma introdotto in GNU coreutils 8.15. Questo è troppo vecchio per essere in Debian squeeze o addirittura ansimante; al momento in cui scrivo, nemmeno Debian unstable lo distribuisce. Questo programma è molto vicino areadlink -f
.
Per qualche ragione, hai una funzione di shell che emula in parte il comportamento di realpath
. Questa emulazione è parziale:se la chiami su un collegamento simbolico, non segue il collegamento simbolico.
Poiché si tratta di una funzione di shell, presumibilmente caricata da o tramite .bashrc
, è disponibile solo per il codice in esecuzione nella shell interattiva. Se vuoi che sia disponibile per altri programmi, supponendo che tu stia eseguendo Linux, crea uno script che emuli realpath
:
#!/bin/sh
readlink -f -- "[email protected]"
(Questo non emula realpath
opzioni della riga di comando raramente utilizzate.)
Funziona solo in shell, perché il file di script ha un ambito diverso e non ha accesso alle tue funzioni locali e agli alias definiti nel tuo rc File. E realpath
command in realtà non esiste nel tuo sistema.
Quindi installa realpath
dal pacchetto, definisci la tua funzione (come parte dello script, controlla alcuni esempi) o procurati rc file nello script in cui è definito (ad es. . ~/.bashrc
).
Ecco i passaggi per installare realpath
se non è presente:
- Ubuntu:
sudo apt-get install coreutils
- OS X:
brew install coreutils
Ubuntu e Debian
Su Debian o Ubuntu sembra il realpath
dovrebbe essere installato per impostazione predefinita. Ho controllato la recente Debian 8 (Jessie) e sembra avere coreutils
installato per impostazione predefinita.
Testato utilizzando nuove immagini VM:
$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
Quindi in VM:
$ type -a realpath
realpath is /usr/bin/realpath
Invece di realpath
, puoi anche utilizzare readlink -f file
(o greadlink
) fornito da coreutils
anche il pacchetto.
realpath è un vero comando o uno script? Verificherei per vedere da dove proviene.
$ type -a realpath
Non ho familiarità con questo strumento, quindi probabilmente non fa parte della tua normale distribuzione, forse è installato in una posizione non standard che non è presente su $PATH
di Bash ma è all'interno del $PATH
del tuo ambiente di accesso .
In ogni caso, il precedente type
command ti mostrerà da dove proviene il comando, a quel punto puoi modificare il metodo che lo stai chiamando nel tuo script in questo modo:
echo $(/path/to/realpath test.sh)
Oppure modifica il $PATH
del tuo script in modo che includa anche questa posizione non standard.
Funzioni nella shell
Gran parte del tuo ambiente non viene chiamato quando invochi uno script di shell. Se ci pensi, questo ha molto senso, dal momento che generalmente non vuoi che gli script abbiano tutto il bagaglio aggiuntivo che potrebbe avere l'ambiente di un utente.
Puoi determinare quale file di origine fornisce questa funzione e crearne la fonte o semplicemente istruire Bash a incorporare il tuo ambiente di accesso.
#!/bin/bash -l
echo $(realpath "$1")