Hay al menos dos programas llamados realpath
:
- Un programa antiguo de cuando GNU coreutils no incluía
readlink -f
. Ahora está en desuso a favor dereadlink -f
, muchas distribuciones han dejado de incluirlo. - El
realpath
programa introducido en GNU coreutils 8.15. Esto es demasiado antiguo para estar en Debian squeeze o incluso sibilante; en el momento de escribir este artículo, Debian unstable tampoco lo incluye. Este programa está muy cerca dereadlink -f
.
Por alguna razón, tiene una función de shell que emula en parte el comportamiento de realpath
. Esta emulación es parcial:si lo llama en un enlace simbólico, no sigue el enlace simbólico.
Dado que esta es una función de shell, presumiblemente cargada desde o a través de .bashrc
, solo está disponible para el código que se ejecuta en su shell interactivo. Si desea que esté disponible para otros programas, suponiendo que está ejecutando Linux, cree un script que emule realpath
:
#!/bin/sh
readlink -f -- "[email protected]"
(Esto no emula realpath
opciones de línea de comando rara vez usadas).
Funciona solo en shell, porque el archivo de script tiene un alcance diferente y no tiene acceso a sus funciones locales y alias definidos en su rc archivos Y realpath
el comando en realidad no existe en su sistema.
Así que instala realpath
del paquete, defina su propia función (como parte de la secuencia de comandos, consulte algunos ejemplos) u obtenga el rc archivo en su secuencia de comandos donde está definido (por ejemplo, . ~/.bashrc
).
Estos son los pasos para instalar realpath
si no está presente:
- Ubuntu:
sudo apt-get install coreutils
- OS X:
brew install coreutils
Ubuntu y Debian
En Debian o Ubuntu parece el realpath
debe instalarse por defecto. Revisé el reciente Debian 8 (Jessie) y parece tener coreutils
instalado por defecto.
Probado usando imágenes de VM nuevas:
$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
Luego en VM:
$ type -a realpath
realpath is /usr/bin/realpath
En lugar de realpath
, también puedes usar readlink -f file
(o greadlink
) proporcionado por coreutils
paquete también.
¿Realpath es un comando real o un script? Verificaría de dónde viene.
$ type -a realpath
No estoy familiarizado con esta herramienta, por lo que es probable que no forme parte de su distribución normal, tal vez esté instalada en una ubicación no estándar que no está presente en el $PATH
de Bash. pero está dentro del $PATH
de su entorno de inicio de sesión .
En cualquier caso, el type
anterior comando le mostrará de dónde proviene el comando, momento en el que puede modificar el método que está llamando en su secuencia de comandos de la siguiente manera:
echo $(/path/to/realpath test.sh)
O modifique el $PATH
de su secuencia de comandos para que también incluya esta ubicación no estándar.
Funciones en el shell
Gran parte de su entorno no se llama cuando invoca un script de shell. Si piensa en esto, tiene mucho sentido, ya que generalmente no desea que los scripts tengan todo el equipaje adicional que puede tener el entorno de un usuario.
Puede determinar qué archivo fuente proporciona esta función y obtenerla, o simplemente indicarle a Bash que incorpore su entorno de inicio de sesión.
#!/bin/bash -l
echo $(realpath "$1")