it-swarm.com.de

Mehrzeiliger Alias ​​in der Bash

Ich habe das folgende Skript. Es ist ein einfacher Testfall, in dem a ein beliebiger Zeichenfolgenwert ist und b ein Pfad sein soll.

#!/bin/bash

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

Bei jedem Versuch, ./sample.sh auszuführen, erhalte ich jedoch die folgenden Fehlermeldungen:

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

und wenn ich source sample.sh versuche, erhalte ich Folgendes:

a: Undefined variable.

Mein Ziel war es, dies zu einem Alias ​​zu machen, damit ich dieses Skript als Quelle verwenden und einfach den Alias ​​ausführen kann, um die Befehlszeile auszuführen. Kann sich jemand das anschauen und mich wissen lassen, was der Fehler ist?

10
Jovin Miranda

Sie haben hier ein paar Probleme

  1. im Gegensatz zu csh werden in bash (und anderen Bourne-ähnlichen Shells) Aliase mit einem = -Zeichen, z. alias foo=bar

  2. anführungszeichen können nicht so verschachtelt werden; In diesem Fall können Sie den Alias ​​in einfache Anführungszeichen und die doppelten Anführungszeichen setzen

  3. der umgekehrte Schrägstrich \ ist ein Zeilenfortsetzungszeichen : Syntaktisch macht es Ihren Befehl zu einem einzelnen Zeile (das Gegenteil von dem, was Sie wollen)

Damit

#!/bin/bash

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

Testen: Zuerst beziehen wir die Datei:

$ . ./myscript.sh

dann

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

Wenn Sie den Alias ​​ innerhalb eines Skripts verwenden möchten, denken Sie daran, dass Aliase standardmäßig nur in interaktiven Shells aktiviert sind: Um sie innerhalb eines Skripts zu aktivieren, müssen Sie dies tun muss hinzufügen

shopt -s expand_aliases

nabhängig von allem, was oben steht, sollten Sie in Betracht ziehen, eine Shell-Funktion anstelle eines Alias ​​für solche Dinge zu verwenden.

12
steeldriver

Gewöhnen Sie sich an die Verwendung von Funktionen in der POSIX-Shell. Sie haben keine der folgenden Probleme:

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