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.