Nowy alias niedostępny po;

9

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, kshI bashzachowują się tak samo. Przynajmniej cshnie 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?

użytkownik3224237
źródło
„Myślałem, że średnik w powłoce ma (jakoś) to samo znaczenie, co łamanie linii” Prawie. Nie do końca!
Wyścigi lekkości na orbicie
1
Interpretacja średnika i nowej linii zależy od tego, jak wywoływany jest parser. W przypadku polecenia „kropka” Bourne Shell wywołuje analizator składni z „NLFLG”, który mówi mu, aby traktował znak nowej linii i średnik w równych sytuacjach w niektórych sytuacjach, ale w innych przypadkach tak nie jest. Ogólnie rzecz biorąc, średnik i podział wiersza nie są równoważne, ponieważ możesz mieć podział wiersza, w którym średnik spowodowałby błąd składniowy.
schily,

Odpowiedzi:

9

Używana składnia aliasu jest nieodpowiednia dla powłoki POSIX, w przypadku powłoki POSIX należy użyć:

alias name='replacement'

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.

schily
źródło
Ponadto niektóre powłoki lubią yashlub zshnie chciałyby rozszerzać aliasu w shell -c 'alias name=replacement<newline>replacement'. W przypadku AT&T kshmasz problem ze skryptami źródłowymi .
Stéphane Chazelas
W tym przypadku muszę użyć csh - =w aliasskładni nie ma żadnego .
user3224237,
@ user3224237 - nie ma to nic wspólnego z =. dzieje się tak, ponieważ rozszerzenie aliasu ma miejsce, gdy powłoka po raz pierwszy zobaczy linię, która jest przed zdefiniowaniem aliasu.
cas
@ Stéphane Chazelas Zachowanie skryptów „sourced” jest spowodowane faktem, że powłoka Bourne'a całkowicie analizuje takie pliki przed ich wykonaniem. Ksh opiera się na źródle Bourne Shell i wszystko, co nie zostało zmienione, zachowuje się tak samo.
schily,
@schily, tak, to ten sam powód, dla zsh/yash -c 'code'którego codejest analizowany jako całość. Wydaje się, że nie dotyczy to powłoki Bourne'a. Więc przypuszczam, że powłoka Bourne'a analizuje, że jest codetam jedna linia na raz.
Stéphane Chazelas,
5

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>polecenie aliasnie zostało wykonane.

Cuonglm
źródło