Do tej pory myślałem, że średnik w powłoce ma (w jakiś sposób) takie samo znaczenie jak podział linii. Byłem więc zaskoczony tym
alias <name>=<replacement text>; <name>
<name>
jest nieznany, gdy jest znany w następnym wierszu. csh
, tcsh
, sh
, ksh
I bash
zachowują się tak samo. Przynajmniej csh
nie ma znaczenia, czy alias zostanie użyty bezpośrednio, czy skrypt zostanie pobrany przed średnikiem - aliasy nie są znane po, ;
ale są znane w następnym wierszu poleceń. Czy to błąd, czy takie zachowanie jest zamierzone?
Odpowiedzi:
Używana składnia aliasu jest nieodpowiednia dla powłoki POSIX, w przypadku powłoki POSIX należy użyć:
Ale dla wszystkich powłok nie może to działać, ponieważ zastępowanie aliasu odbywa się na początku parsera.
Przed wykonaniem instalacji aliasu parser odczytał całą linię i z tego powodu linia poleceń nie będzie działać.
Jeśli alias pojawi się w następnym wierszu polecenia, zadziała.
źródło
yash
lubzsh
nie chciałyby rozszerzać aliasu wshell -c 'alias name=replacement<newline>replacement'
. W przypadku AT&Tksh
masz problem ze skryptami źródłowymi .=
walias
składni nie ma żadnego .=
. dzieje się tak, ponieważ rozszerzenie aliasu ma miejsce, gdy powłoka po raz pierwszy zobaczy linię, która jest przed zdefiniowaniem aliasu.zsh/yash -c 'code'
któregocode
jest analizowany jako całość. Wydaje się, że nie dotyczy to powłoki Bourne'a. Więc przypuszczam, że powłoka Bourne'a analizuje, że jestcode
tam jedna linia na raz.To zachowanie jest zamierzone i określone przez POSIX w Alias Substitution .
Alias został zastąpiony zaraz po wykonaniu przez powłokę rozpoznawania tokenów i przed zastosowaniem jakichkolwiek reguł gramatyki . W momencie wywołania aliasu
<name>
poleceniealias
nie zostało wykonane.źródło