Alias ​​multilínea en bash

13

Tengo el siguiente script. Es un caso de prueba simple donde ahay cualquier valor de cadena y bse supone que es una ruta.

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

Sin embargo, cada vez que intento ejecutar ./sample.sh obtengo los siguientes errores:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

y cuando lo intento source sample.shobtengo lo siguiente:

a: Undefined variable.

Mi objetivo era hacer de esto un alias para poder obtener este script y simplemente ejecutar el alias para ejecutar la línea de comandos. ¿Alguien puede mirar esto y decirme cuál es el error?

Jovin Miranda
fuente
3
Cuando crea que necesita un alias de varias líneas y comandos múltiples, es hora de definir una función o crear un script.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy notó eso
Jovin Miranda el

Respuestas:

15

Tienes un par de problemas aquí.

  1. a diferencia de in csh, in bash(y otros shells tipo Bourne), los alias se asignan con un =signo, p.alias foo=bar

  2. las comillas no se pueden anidar así; en este caso, puede usar comillas simples alrededor del alias y comillas dobles dentro

  3. la barra diagonal inversa \es un carácter de continuación de línea : sintácticamente, convierte su comando en una sola línea (lo contrario de lo que desea)

Entonces

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

Prueba: primero buscamos el archivo:

$ . ./myscript.sh

luego

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

Si desea utilizar el alias dentro de un script, recuerde que los alias solo están habilitados de forma predeterminada en shells interactivos: para habilitarlos dentro de un script, deberá agregar

shopt -s expand_aliases

Independientemente de todo lo anterior, debe considerar usar una función de shell en lugar de un alias para cosas como esta

conductor de acero
fuente
1
Otra razón para utilizar comillas simples alrededor del alias es que las variables entre comillas dobles se expanden, por lo que $ay $bse ampliarían en tiempo de definición, no cuando se ejecuta el alias.
Barmar
Gracias por la solución, el problema aquí es a pesar de que escribí el script tal como lo indicaste y cuando lo ejecuto me sale jo: el comando no encontró el alias por alguna razón no se registra. cuando obtengo el archivo, obtengo este error Incomparable ". La única razón por la que estoy haciendo un alias y no funciona es porque quiero llamar a esta línea de código en la línea de comando y en la función no sé cómo lograrlo. He visto la llamada a la función generalmente está dentro del script. El uso del alias fue solo para asegurarme de que puedo usarlo como una función y llamarlo cuando lo desee
Jovin Miranda
de todos modos lo solucioné, estaba usando shell predeterminado como tcsh, por lo tanto, el problema estaba llegando
Jovin Miranda
8

Acostúmbrate a usar funciones en el shell de tipo POSIX. No tiene ninguno de los problemas de cotización:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}
Glenn Jackman
fuente
Gracias por la solución, esto funcionó cuando llamé a la función dentro del script. ¿Cómo llamo a la función desde la línea de comandos en sí? Esa fue la razón por la que
elegí
Es exactamente lo mismo. Coloque las funciones en un archivo y obtenga ese archivo
glenn jackman
Lo entendí lo que realmente hice es usar el siguiente. comando "$ @" para poder llamar el nombre de la función mientras
ejecuto