Alias ​​multilinea in bash


13

Ho il seguente script. È un semplice caso di test in cui aè presente qualsiasi valore di stringa e bdovrebbe essere un percorso.

#!/bin/bash

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

Tuttavia, ogni volta che provo a eseguire ./sample.sh ottengo i seguenti errori:

./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

e quando provo source sample.shottengo quanto segue:

a: Undefined variable.

Il mio obiettivo era quello di rendere questo un alias in modo da poter generare questo script ed eseguire l'alias per eseguire la riga di comandi. Qualcuno può guardare questo e farmi sapere qual è l'errore?


3
Quando pensi di aver bisogno di alias multilinea e comandi multipli, è tempo di definire una funzione o creare uno script.
Sergiy Kolodyazhnyy,

@SergiyKolodyazhnyy ha notato che
Jovin Miranda

Risposte:


15

Hai un paio di problemi qui

  1. diversamente da in csh, in bash(e altre shell simili a Bourne), gli alias sono assegnati con un =segno, ad esalias foo=bar

  2. le virgolette non possono essere nidificate in questo modo; in questo caso, puoi usare virgolette singole attorno all'alias e doppie virgolette all'interno

  3. la barra rovesciata \è un carattere di continuazione della riga : sintatticamente, trasforma il tuo comando in a singola riga (l'opposto di quello che vuoi)

Così

#!/bin/bash

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

Test: prima proviamo il file:

$ . ./myscript.sh

poi

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

Se vuoi usare l'alias all'interno di uno script, ricorda che gli alias sono abilitati di default solo nelle shell interattive: per abilitarli all'interno di uno script dovrai aggiungere

shopt -s expand_aliases

Indipendentemente da tutto quanto sopra, dovresti considerare l'utilizzo di una funzione shell piuttosto che di un alias per cose come questa


1
Un altro motivo per usare le virgolette singole attorno all'alias è che le variabili all'interno delle virgolette doppie vengono espanse, quindi $ae $bdovrebbero essere espanse al momento della definizione, non quando viene eseguito l'alias.
Barmar,

Grazie per la soluzione, il problema qui è nonostante io scriva lo script come indicato da te e quando lo eseguo ottengo jo: il comando non ha trovato l'alias per qualche motivo non viene registrato. quando provo il file allora ottengo questo errore Unmatched ". L'unica ragione per cui sto facendo alias e non funzione è perché voglio chiamare questa riga di codice dalla riga di comando e in funzione non so come raggiungerlo. Ho visto la chiamata alla funzione è di solito all'interno dello script. L'uso dell'alias era solo per assicurarmi di poterlo usare come una funzione e chiamarlo quando lo desidero
Jovin Miranda

comunque risolto, stavo usando la shell predefinita come TCS quindi il problema stava arrivando.
Jovin Miranda,

8

Abituati ad usare le funzioni nella shell di tipo POSIX. Non hai nessuno dei problemi di quotazione:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}

Grazie per la soluzione, ha funzionato quando chiamo la funzione all'interno dello script. Come chiamo la funzione dalla stessa riga di comando, perché ho più di questi script e preferirei una situazione in cui scrivo tutte le funzioni in un file ma le chiamo invece dalla riga di comando. Questa è stata l'intera ragione per cui ho scelto l'alias
Jovin Miranda,

È esattamente lo stesso. Metti le funzioni in un file e sorgente quel file
glenn jackman,

capito quello che ho effettivamente fatto è usare il foll. comando "$ @" in modo da poter chiamare il nome della funzione durante l'esecuzione del file
Jovin Miranda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.