Mehrzeiliger Alias ​​in der Bash

13

Ich habe das folgende Skript. Es ist ein einfacher Testfall, bei dem aes sich um einen beliebigen Zeichenfolgenwert handelt und bder 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 es versuche source sample.shbekomme 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?

Jovin Miranda
quelle
3
Wenn Sie glauben, einen Alias ​​für mehrere Zeilen und Befehle zu benötigen, müssen Sie entweder eine Funktion definieren oder ein Skript erstellen.
Sergiy Kolodyazhnyy
@ SergiyKolodyazhnyy festgestellt, dass
Jovin Miranda

Antworten:

15

Sie haben hier ein paar Probleme

  1. Im Gegensatz zu In csh, In bash(und anderen Bourne-ähnlichen Shells) werden Aliase mit einem =Vorzeichen versehen, zalias 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 Backslash \ist ein Zeilenfortsetzungszeichen : Syntaktisch macht es Ihren Befehl zu einer einzelnen Zeile (das Gegenteil von dem, was Sie wollen).

So

#!/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 in einem Skript verwenden möchten , beachten Sie, dass Aliase standardmäßig nur in interaktiven Shells aktiviert sind: Um sie in einem Skript zu aktivieren, müssen Sie sie hinzufügen

shopt -s expand_aliases

Unabhängig von allem, was oben erwähnt wurde, sollten Sie in Betracht ziehen, eine Shell-Funktion anstelle eines Alias ​​für solche Dinge zu verwenden

Stahlfahrer
quelle
1
Ein weiterer Grund für die Verwendung von einfachen Anführungszeichen um den Alias ​​besteht darin, dass Variablen in doppelten Anführungszeichen erweitert werden $aund $bdaher zum Definitionszeitpunkt erweitert werden, nicht wenn der Alias ​​ausgeführt wird.
Barmar
Vielen Dank für die Lösung, das Problem besteht darin, dass ich das Skript so schreibe, wie Sie es angegeben haben, und wenn ich es ausführe, erhalte ich den Befehl jo: nicht gefunden, der Alias ​​wird aus irgendeinem Grund nicht registriert. Wenn ich die Datei als Quelle habe, erhalte ich den Fehler "Unmatched". Der einzige Grund, warum ich Alias ​​mache und nicht funktioniere, ist, dass ich diese Codezeile in der Befehlszeile aufrufen möchte und in der Funktion nicht weiß, wie ich das erreichen soll. Ich habe gesehen Der Funktionsaufruf erfolgt normalerweise innerhalb des Skripts. Die Verwendung des Alias ​​diente nur dazu, sicherzustellen, dass ich ihn wie eine Funktion verwenden und jederzeit aufrufen kann
Jovin Miranda
Wie auch immer, ich habe die Standard-Shell als tcsh verwendet, daher kam das Problem.
Jovin Miranda
8

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"
}
Glenn Jackman
quelle
Vielen Dank für die Lösung, dies hat funktioniert, als ich die Funktion innerhalb des Skripts aufrufe. Wie rufe ich die Funktion von der Kommandozeile selbst auf, weil ich mehrere solche Skripte habe und lieber eine Situation möchte, in der ich alle Funktionen in eine Datei schreibe, sie aber stattdessen von der Kommandozeile aus aufrufe. Das war der ganze Grund, warum ich mich für einen Pseudonym entschieden habe
Jovin Miranda
Es ist genau das gleiche.
Schreiben
habe es verstanden, was ich tatsächlich getan habe, ist das Folgende zu verwenden. Befehl "$ @", damit ich den Funktionsnamen beim Ausführen der Datei aufrufen kann
Jovin Miranda