Tengo Debian Squeeze AMD64. Mi caparazón actual es bash. Si escribo lo siguiente en mi terminal, funciona:
$ 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
Mi archivo test.sh se ve así:
#!/bin/bash
echo $(realpath "$1")
Si intento ejecutar lo siguiente, aparece un error
$ ./test.sh test.sh
./test.sh: line 2: realpath: command not found
¿Cómo puedo usar el comando realpath dentro de un archivo bash?
Información Adicional
$ 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
. Mi sistema Fedora 19 ahora incluye esta herramienta. Observe también que el OP estaba usando un núcleo Debian w / 2.6, por lo que su sistema también habría faltadorealpath
dada su antigüedad.command
todavía me fue útil. Es una forma más portátil de hacer lo que estaba mostrando en los shells POSIX.Hay al menos dos programas llamados
realpath
:readlink -f
. Ahora está en desuso a favorreadlink -f
, por lo que muchas distribuciones han dejado de llevarlo.realpath
programa introducido en GNU coreutils 8.15. Esto es demasiado viejo para estar en Debian squeeze o incluso sibilante; al momento de escribir, Debian inestable tampoco lo envía . Este programa está muy cerca dereadlink -f
.Por alguna razón, tiene una función de shell que emula parcialmente el comportamiento de
realpath
. Esta emulación es parcial: si la llamas en un enlace simbólico, no sigue el enlace simbólico.Como se trata de 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 emulerealpath
:(Esto no emula
realpath
las opciones de línea de comandos poco utilizadas).fuente
realpath
programa se considera obsoleto por coreutils, o que no está construido de forma predeterminada. Entonces Debian debe eliminarlo.realpath
binario, que es cercano pero no exactamente idénticoreadlink -f
. Debian estable lleva 8.13. Debian inestable eligió mantener el programa heredado .openssl
?Funciona solo en shell, porque el archivo de secuencia de comandos tiene un alcance diferente y no tiene acceso a sus funciones locales y alias definidos en sus archivos rc . Y el
realpath
comando en realidad no existe en su sistema.Por lo tanto, instale
realpath
desde el paquete, defina su propia función (como parte del script, verifique algunos ejemplos ) o busque el archivo rc en su script donde está definido (por ejemplo. ~/.bashrc
).Estos son los pasos para instalar
realpath
si no está presente:sudo apt-get install coreutils
brew install coreutils
Ubuntu y Debian
En Debian o Ubuntu parece que
realpath
debería instalarse por defecto. Revisé el reciente Debian 8 (Jessie) y parece que secoreutils
instaló por defecto.Probado con nuevas imágenes de VM:
Luego en VM:
En lugar de
realpath
, también puede usarreadlink -f file
(ogreadlink
) proporcionado por elcoreutils
paquete también.fuente
fuente