Nuovo alias non disponibile dopo;


9

Fino ad ora ho pensato che un punto e virgola nella shell avesse (in qualche modo) lo stesso significato di un'interruzione di riga. Quindi ne sono rimasto sorpreso

alias <name>=<replacement text>; <name>

<name>è sconosciuto mentre è noto nella riga successiva. csh, tcsh, sh, kshE bashsi comportano allo stesso. Almeno per cshquesto non importa se l'alias viene utilizzato direttamente o se uno script viene fornito prima del punto e virgola - gli alias non sono noti dopo ;ma sono noti nella riga di comando successiva. È un bug o è previsto questo comportamento?


"Ho pensato che un punto e virgola nella shell avesse (in qualche modo) lo stesso significato di un'interruzione di riga" Quasi. Non proprio!
— Razze di leggerezza in orbita dal

1
L'interpretazione di punto e virgola e newline dipende da come viene chiamato il parser. Per il comando "punto", la Bourne Shell chiama il parser con "NLFLG" che gli dice di trattare newline e punto e virgola uguali in alcune situazioni, ma questo non è il caso altrove. In generale, il punto e virgola e l'interruzione di riga non sono equivalenti in quanto è possibile avere un'interruzione di riga, in cui un punto e virgola causerebbe un errore di sintassi.
— schily,

Risposte:


9

La sintassi alias che stai usando è inappropriata per una shell POSIX, per una shell POSIX, devi usare:

alias name='replacement'

Ma per tutte le shell, questo non può funzionare poiché la sostituzione dell'alias viene eseguita all'inizio del parser.

Prima che venga eseguita la configurazione dell'alias, l'intera riga di lettura è stata letta dal parser e per questo motivo la riga di comando non funzionerà.

Se l'alias appare sulla riga di comando successiva, funzionerà.


Inoltre, alcune shell gradiscono yasho zshnon espandono l'alias in shell -c 'alias name=replacement<newline>replacement'. Per AT&T ksh, avresti il ​​problema con gli script di provenienza .
— Stéphane Chazelas,

Ho bisogno di usare il csh in questo caso - non =viene usato nella aliassintassi.
— user3224237,

@ user3224237 - questo non ha nulla a che fare con il =. è perché l'espansione dell'alias si verifica quando la shell vede per la prima volta la linea, che è prima di definire l'alias.
— Cas

@ Stéphane Chazelas Il comportamento con script "di provenienza" è causato dal fatto che la shell Bourne analizza completamente tali file prima che vengano eseguiti. Ksh si basa sulla fonte Bourne Shell e tutto ciò che non è stato modificato si comporta allo stesso modo.
— schily,

@schily, sì, è lo stesso motivo per zsh/yash -c 'code'cui codeviene analizzato nel suo insieme. Non sembra essere il caso della shell Bourne. Quindi suppongo che la shell Bourne analizzi che codeci sia una riga alla volta.
— Stéphane Chazelas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.