No estas registrado.

#1 2015-01-12 00:05:39

Negro Lito
Tuxes
Registrado: 2013-07-28
Mensajes: 34

Problema con los espacios en argumentos en un script de Bash

Holas

Estoy haciendo un scritp en Bash que me permita hacer un enlace blando. El código es el siguiente:

#!/bin/bash
echo "a "$1
ln -s $PWD/$1 ./"a "$1

El script se llama "hacerenlace" y se usa:

$ hacerenlace elarchivo.pdf
Es script es lanzado en el mismo directorio en dónde se encuentra el archivo a enlazar. Como resultado obtendría un enlace denominado "a elarchivo.pdf"
La partícula "a " se anexa porque no se puede tener en el mismo directorio dos archivos con el mismo nombre, o al menos así me lo hizo saber el sistema.
Así como está parece funcionar bien. El mono se me sube a la palmera cuando le paso como parámentro un nombre de archivo con espacios. Ej:

$ hacerenlace Curso Css.pdf
$ hacerenlace Curso\ Css.pdf
$ hacerenlace "Curso Css.pdf"
$ hacerenlace "Curso\ Css.pdf"

En la primera variante me tira un error con los parámetros; pero en las otras tres me da:

a Curso Css.pdf
ln: el objetivo «Css.pdf» no es un directorio

El comando

echo "a "$1

Está ahí para testear cómo se arma la cadena.


Vine, vi y así me fue.

Desconectado

#2 2015-01-12 14:56:34

Wada
Staff
Registrado: 2012-07-31
Mensajes: 448
Página Web

Re: Problema con los espacios en argumentos en un script de Bash

Bueno para comenzar.

$ hacerenlace Curso Css.pdf #Incorrecto: Se toma como 2 argumentos
$ hacerenlace Curso\ Css.pdf #Correcto
$ hacerenlace "Curso Css.pdf" #Correcto
$ hacerenlace "Curso\ Css.pdf" #Incorrecto: No coincide con el nombre por \

Para no complicar las cosas, el problema esta en esta en las dobles comillas, así ln lo tomara como un parámetro completo y no como varios argumentos.

#!/bin/bash
echo "a $1"
ln -s "$PWD/$1" "./a $1"

Estoy seguro que esto solucionaría tu problema dudas pregunta. Extrañaba que alguien preguntara en el foro y no en ask, para poder hacer retroalimentación smile


[⠠⠵] || Archlinux || Awesome || urxvt || Bash

Desconectado

#3 2015-01-12 16:07:37

Negro Lito
Tuxes
Registrado: 2013-07-28
Mensajes: 34

Re: Problema con los espacios en argumentos en un script de Bash

Gracias Wada.

Quedó de diez. Acá el script completo:

#!/bin/bash

elarchivo="a $1"
ln -s "$PWD/$1" "./$elarchivo"
mv "./$elarchivo" "/home/negro/Escritorio/LECTURAS/$elarchivo"

Ahora implemento una variable y he tenido un problema similar con mv; así que el tema de las comillas tiene cierta trascendencia.

Lo que viene a solucionarme este adefecio es lo siguiente: Resulta que tengo varias lecturas pendientes y cuanto pdf, epub, html, etc que encontraba y que por varias razones deseaba leer con cierta prioridad, los dejaba en el escritorio llenándome de íconos el mismo.
Por otro lado resulta que también tengo en el home/ una carpeta llamada BIBLIOTECA (que tengo la intensión de hacer como  determinada) en donde tengo una multitud de libros, apuntes y tutos en los más diversos formatos y en un intento de clasificación.
Entonces para despejar el escritorio se me ocurrió guardar como siempre la data en BIBLIOTECA y con el script generar el enlace y mover el mismo a otra carpeta situada en el Escritorio llamada LECTURA.
De esta forma voy creando una suerte de "preferidos" que voy a encontrar en dicha carpeta.

Gracias nuevamente y el scritp anda de lujo.

Suerte.


Vine, vi y así me fue.

Desconectado

#4 2015-01-12 17:10:55

notfrombrooklyn
Tuxes
Desde: Sevilla
Registrado: 2013-02-20
Mensajes: 693
Página Web

Re: Problema con los espacios en argumentos en un script de Bash

Igual te interesa cambiar a esto:

#!/bin/bash
echo "a $@"
ln -s "$PWD/$@" "./a $@"

Ejemplo de uso de $@:

#!/usr/bin/bash
echo "Esto es @1 !!!"

Las pruebas:

$ test.sh Sparta
Esto es Sparta !!!
$ test.sh Sparta, Grecia
Esto es Sparta, Grecia !!!

El problema del código de antes es que solo cogía el primer parámetro. $@ coge todos los parámetros que le hayas pasado al script ($1 $2 ... $n).

Desconectado

#5 2015-01-13 22:16:08

Negro Lito
Tuxes
Registrado: 2013-07-28
Mensajes: 34

Re: Problema con los espacios en argumentos en un script de Bash

Gracias notfrombrooklyn

Me interesa porque aparentemente uno se puede librar de las comillas o del caracter de escape a la hora de tipear el argumento del script, o sea:

$ hacerenlace Curso Css.pdf

Lo he implementado así:

#!/bin/bash

elarchivo="a $@"
ln -s "$PWD/@1" "./$elarchivo"
mv "./$elarchivo" "/home/negro/Escritorio/LECTURAS/$elarchivo"

El script parece funcionar bien pero cuando voy a usar el enlace me tira el siguiente error:

El destino de este enlace simbólico no existe o no tiene permiso para acceder a él:
/home/negro/Escritorio/LECTURAS/a Curso Css.pdf

Destino: /home/negro/BIBLIOTECA/@1

Incluso cuando le pongo comillas o el caracter de escape.

Suerte.


Vine, vi y así me fue.

Desconectado

#6 2015-01-13 22:29:58

Negro Lito
Tuxes
Registrado: 2013-07-28
Mensajes: 34

Re: Problema con los espacios en argumentos en un script de Bash

Camibié la línea:

ln -s "$PWD/@1" "./$elarchivo"

por:

ln -s "$PWD/$@" "./$elarchivo"

Pero al correrlo me tira:

a Curso Css.pdf
ln: el objetivo «./a Curso Css.pdf» no es un directorio
mv: no se puede efectuar `stat' sobre «./a Curso Css.pdf»: No existe el fichero o el directorio

De todos modos tuve la ocurrencia iniciar el argumento del script con comillas, tipear varias letras del mismo y luego precionar Tab y para sorpresa mía completo el nombre del archivo y le puso la comilla faltante al final.


Vine, vi y así me fue.

Desconectado

#7 2015-01-14 04:38:47

notfrombrooklyn
Tuxes
Desde: Sevilla
Registrado: 2013-02-20
Mensajes: 693
Página Web

Re: Problema con los espacios en argumentos en un script de Bash

¿Qué es lo que esperas que haga esta línea?

ln -s "$PWD/@1" "./$elarchivo"

Crea un enlace simbólico llamado "./$elarchivo" que apunta a "$PWD/@1". Un ejemplo, PWD=/home/negro/Escritorio/LECTURAS @1="Curso Css.pdf" y elarchivo="a Curso Css.pdf". Esto crearía un enlace simbólico llamado "./a Curso Css.pdf" que apuntaría a "/home/negro/Escritorio/LECTURAS/Curso Css.pdf".

¿Qué esperas que haga ese punto? ¿Qué esperas que haga esa barra? ¿No debería ser?:

ln -s "$PWD/@1" "$elarchivo"

PD: Que yo sepa, las variables en bash por convención se escriben en mayúsculas (PWD, SHELL, HOSTNAME, etc) para facilitar su lectura. Desdeluego a mí me facilitó bastante cuando empecé a hacerlo de ese modo. Es una sugerencia.

Desconectado

#8 2015-01-14 13:59:45

Negro Lito
Tuxes
Registrado: 2013-07-28
Mensajes: 34

Re: Problema con los espacios en argumentos en un script de Bash

Hola notfrombrooklyn

Estoy al tanto lo de las mayúsculas, se ve que me agarró pereza de apretar Bloq. Mayús cuando la escribí. Lo he corregido.

Al script lo corro en el mismo directorio dónde está el archivo a enlazar, de esa forma capturo en PWD el path (por eso también tengo conflicto con el nombre de archivo y le agrego el prefijo "a ") y luego le sumo el nombre del archivo a enlazar. La idea es no ponerse a tipear el path (como podrás ver soy muy vago).

Entonces la expresión "$PWD/@1" sería igual a "/home/negro/BIBLIOTECA/Curso Css.pdf". Esto constituiría a dónde apunta el enlace. Pero cuando lo uso me tira el error:

El destino de este enlace simbólico no existe o no tiene permiso para acceder a él:
/home/negro/Escritorio/LECTURAS/a Curso Css.pdf

Destino: /home/negro/BIBLIOTECA/@1

Entonces lo he cambiado por:

"$PWD/$@"

y funciona.

La expresión "./$EL_ARCHIVO", constituiría el cómo se llama el enlace y dónde está.
Le he quitado la particula "./" y parece funcionar igual.

Luego el comando mv lo mueve a /home/negro/Escritorio/LECTURAS/ el archivo "a Curso Css.pdf"

Lo que yo esperaba, ingenuamente, es librarme de las comillas o el caracter de escape al pasar el parámero al script.

Esta vendría a ser la versión que ahora me funciona.

#!/bin/bash

EL_ARCHIVO="a $@"
ln -s "$PWD/$@" "$EL_ARCHIVO"
mv "./$EL_ARCHIVO" "/home/negro/Escritorio/LECTURAS/$EL_ARCHIVO"

Vine, vi y así me fue.

Desconectado

#9 2015-01-15 04:43:27

notfrombrooklyn
Tuxes
Desde: Sevilla
Registrado: 2013-02-20
Mensajes: 693
Página Web

Re: Problema con los espacios en argumentos en un script de Bash

El script que tienes debería funcionarte pasándole un parámetro sin comillas. Vamos, que en ese aspecto está finalizado.

Ahora la parte que ha pillado mi interés. No entiendo lo de "./". Me gustaría saber por qué no lo quitas, si es porque eres algo obstinado y cabezota (como yo) o si es por alguna razón de cómo funciona bash y que yo desconozco.

Otra cosa. Yo que tu cambiaría lo del PWD, qué pasa si trabajas desde la carpeta Workspace o Docmentos o Descargas/lo que sea, no te funcionaría.

#!/bin/bash

ARCHIVO = "a $@"
DESTINO = "/home/negro/Escritorio/LECTURAS/$ARCHIVO"
ENLACE = "/home/$USER/Escritorio/$@" # Supongo que $PWD era /home/$USER/Escritorio

ln -s $ENLACE $ARCHIVO
mv $ARCHIVO $DESTINO

Por último, cuando utilizas variables en vez de cadenas de caracteres, no debería hacerte falta las comillas. Corrrígeme si me equivoco, en ese caso se de una manera para preprocesar las variables en $@ y añadirles "\".

Desconectado

#10 2015-01-15 22:58:46

Negro Lito
Tuxes
Registrado: 2013-07-28
Mensajes: 34

Re: Problema con los espacios en argumentos en un script de Bash

¡SIIIIIIIIIIIIIIIIIIIIIIIIIIIII!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Funcionó.
Ahora puedo tipear sin comillas en la línea de comandos y responde bien.

El tema está en las comilas en las variables al pasárselas a los comandos:

ln -s "$ENLACE" "$EL_ARCHIVO"
mv "$EL_ARCHIVO" "$DESTINO"

Si le quito las comillas me tira un error.

Me gustó lo de $USER, eso universalizaría más el script.

El PWD lo tengo que implementar porque en /home/negro/BIBLIOTECA tengo también otros directorios como COMPUTACION/, LITERATURA/ REVISTAS_DIGITALES/, etc y dentro de ellos hay otras subdivisiones.

Ya quité el "./" que faltaba y sigue funcionando.

Me estoy divirtiendo con el script.

$ hacerenlace cartas a quien pretende ensenar.pdf 
----------------------------------------------------------------------------------------
Nombre del enlace:                 a cartas a quien pretende ensenar.pdf
A donde apunta el enlace:          /home/negro/BIBLIOTECA/cartas a quien pretende ensenar.pdf
A donde va a ser movido el enlace: /home/negro/Escritorio/LECTURAS/a cartas a quien pretende ensenar.pdf
----------------------------------------------------------------------------------------

$ hacerenlace Cinco ecuaciones que cambiaron el mundo - Michael Guillen.pdf 
----------------------------------------------------------------------------------------
Nombre del enlace:                 a Cinco ecuaciones que cambiaron el mundo - Michael Guillen.pdf
A donde apunta el enlace:          /home/negro/BIBLIOTECA/Cinco ecuaciones que cambiaron el mundo - Michael Guillen.pdf
A donde va a ser movido el enlace: /home/negro/Escritorio/LECTURAS/a Cinco ecuaciones que cambiaron el mundo - Michael Guillen.pdf
----------------------------------------------------------------------------------------

$ hacerenlace la insoportable levedad del ser.pdf 
----------------------------------------------------------------------------------------
Nombre del enlace:                 a la insoportable levedad del ser.pdf
A donde apunta el enlace:          /home/negro/BIBLIOTECA/la insoportable levedad del ser.pdf
A donde va a ser movido el enlace: /home/negro/Escritorio/LECTURAS/a la insoportable levedad del ser.pdf
----------------------------------------------------------------------------------------

Así mismo, cuando el nombre de archivo es muy largo y al quinto o sexto caracter ya sabemos que es singularizado de los demás y apretamos TAB, solito el sistema inserta los caracter de escape.

El script en cuestión que queda es:

#!/bin/bash

EL_ARCHIVO="a $@"
DESTINO="/home/$USER/Escritorio/LECTURAS/$EL_ARCHIVO"
ENLACE="$PWD/$@"
echo "----------------------------------------------------------------------------------------"
echo "Nombre del enlace:                 $EL_ARCHIVO"
echo "A donde apunta el enlace:          $ENLACE"
echo "A donde va a ser movido el enlace: $DESTINO"
echo "----------------------------------------------------------------------------------------"
ln -s "$ENLACE" "$EL_ARCHIVO"
mv "$EL_ARCHIVO" "$DESTINO"

Más legible y simplificado.
Voy a tratar de mejorarlo con otras cuestiones como que compruebe la existencia del archivo a enlazar y que me tire una pequeña ayuda si se pone cualquier cosa como argumento.

Gracia y suerte.


Vine, vi y así me fue.

Desconectado

Pie de página

Powered by FluxBB