it-swarm-es.tech

¿Cómo divido la variable $ 0 para encontrar el directorio y las rutas relativas en bash?

La variable $ 0 contiene la información de la ruta del script.

  • ¿Cómo puedo cambiar la información de ruta a ruta absoluta? Me refiero a cómo procesar ~,., .. o similar.
  • ¿Cómo puedo dividir la información de la ruta en directorio y nombre de archivo?

Podría usar python/Perl para esto, pero quiero usar bash si es posible.

10
prosseek

No es necesario procesar cosas como ~, Shell lo hace por usted. Por eso puedes pasar ~/filename a cualquier script o programa y funciona; todos esos programas no manejan ~ ellos mismos, su Shell convierte el argumento a /home/username/filename y pasa eso al programa en su lugar:

$ echo ~/filename
/home/mrozekma/filename

Si necesita un nombre de archivo canónico (uno que no incluya cosas como ..), use realpath (gracias Neil ):

$ realpath ~/../filename
/home/filename

En cuanto a dividir la ruta en nombre de directorio y nombre de archivo, use dirname y basename:

$ dirname /foo/bar/baz
/foo/bar

$ basename /foo/bar/baz
baz
17
Michael Mrozek

Usar dirname y basename como lo mencionó Michael debería ser la forma más segura de obtener lo que desea.

De todos modos, si realmente desea hacer esto con "herramientas de solo bash", puede usar la sustitución de parámetros:

echo `basename $PWD`        # Basename of current working directory.
echo "${PWD##*/}"           # Basename of current working directory.
echo
echo `basename $0`          # Name of script.
echo $0                     # Name of script.
echo "${0##*/}"             # Name of script.
echo
filename=test.data
echo "${filename##*.}"      # data
                            # Extension of filename.

Este ejemplo está tomado directamente de la Advanced Bash Scripting Guide que vale la pena ver.

La explicación es bastante simple:

$ {var # Pattern} Elimina de $ var la parte más corta de $ Pattern que coincide con la interfaz de $ var. $ {var ## Pattern} Elimina de $ var la parte más larga de $ Pattern que coincide con la interfaz de $ var.

Mira el patrón como una expresión regular y el # o ## como una especie de modificador codicioso/no codicioso.

Esto puede resultar útil si tiene que realizar extracciones más complicadas de una parte de rutas.

5
echox

realpath es un comando que le indica la ruta real (elimina .. y enlaces simbólicos, etc.)

Es estándar con FreeBSD. Según esta discusión, también está disponible para Linux:

http://www.unix.com/Shell-programming-scripting/89294-geting-real-path.html

Esa discusión también ofrece una solución bash:

$ bash -c "cd /foo/../bar/ ; pwd"
2
delete