Alias ​​wieloliniowy w bash

13

Mam następujący skrypt. Jest to prosty przypadek testowy, w którym adowolna wartość łańcucha i bma być ścieżką.

#!/bin/bash

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

Jednak za każdym razem, gdy próbuję wykonać ./sample.sh, pojawiają się następujące błędy:

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

a kiedy próbuję source sample.sh, otrzymuję:

a: Undefined variable.

Moim celem było uczynienie z niego aliasu, aby móc pobrać ten skrypt i po prostu uruchomić alias, aby wykonać wiersz poleceń. Czy ktoś może na to spojrzeć i powiedzieć, jaki jest błąd?

Jovin Miranda
źródło
3
Kiedy uważasz, że potrzebujesz aliasu wieloliniowego i wielu poleceń, nadszedł czas, aby zdefiniować funkcję lub utworzyć skrypt.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy zauważył, że
Jovin Miranda

Odpowiedzi:

15

Masz tutaj kilka problemów

  1. w przeciwieństwie do in csh, in bash(i innych powłok podobnych do Bourne'a) aliasom przypisuje się =znak npalias foo=bar

  2. cytatów nie można tak zagnieżdżać; w takim przypadku możesz użyć pojedynczych cudzysłowów wokół aliasu i podwójnych cudzysłowów w środku

  3. ukośnik odwrotny \jest znakiem kontynuacji linii : składniowo zamienia twoje polecenie w jedną linię (odwrotnie niż chcesz)

Więc

#!/bin/bash

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

Testowanie: najpierw pozyskujemy plik:

$ . ./myscript.sh

następnie

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

Jeśli chcesz użyć aliasu w skrypcie, pamiętaj, że aliasy są domyślnie włączone tylko w interaktywnych powłokach: aby włączyć je w skrypcie, musisz dodać

shopt -s expand_aliases

Bez względu na wszystko powyżej, powinieneś rozważyć użycie funkcji powłoki zamiast aliasu dla takich rzeczy

steeldriver
źródło
1
Innym powodem korzystania apostrofów wokół aliasu jest, że zmienne wewnątrz cudzysłowy są rozszerzane, tak $ai $bbędzie rozszerzony w momencie definicji, a nie wtedy, gdy wykonywana jest alias.
Barmar
Dzięki za rozwiązanie, problem polega na tym, że piszę skrypt podany przez ciebie, a kiedy go wykonuję, dostaję polecenie jo: polecenie nie znalazło aliasu z jakiegoś powodu nie zostało zarejestrowane. kiedy źródłowy plik, wtedy pojawia się ten błąd Niezrównany ". jedynym powodem, dla którego robię alias, a nie funkcję, jest to, że chcę wywołać ten wiersz kodu w wierszu poleceń, aw funkcji nie wiem, jak to osiągnąć. widziałem wywołanie funkcji jest zwykle zawarte w skrypcie. Użycie aliasu było po prostu po to, aby upewnić się, że mogę go używać jak funkcję i wywoływać go, kiedy chcę
Jovin Miranda
tak czy inaczej to naprawiłem, używałem domyślnej powłoki jako tcsh, więc problem nadchodził.
Jovin Miranda,
8

Przyzwyczaj się do używania funkcji w powłoce typu POSIX. Nie masz żadnych problemów z cytowaniem:

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
źródło
Dzięki za rozwiązanie, zadziałało, gdy wywołałem funkcję w skrypcie. Jak wywołać funkcję z samego wiersza poleceń, ponieważ mam wiele takich skryptów i wolę sytuację, w której piszę wszystkie funkcje w jednym pliku, ale zamiast tego wywołuję je z wiersza polecenia. To był cały powód, dla którego
wybrałem
Jest dokładnie tak samo. Umieść funkcje w pliku i źródło tego pliku
glenn jackman
mam to, co właściwie zrobiłem, to użyć foll. polecenie „$ @”, abym mógł wywołać nazwę funkcji podczas wykonywania pliku
Jovin Miranda,