2014-12-02 22 views
6

Ho una domanda.Perché ksh88 e ksh93 consentono i backtick non chiusi?

io non capisco il motivo per cui quando si digita:

echo "`date -d 20121231 +"%B 

Esegue senza errori:

December 

Perché viene eseguito con successo quando l'apertura

`

non è chiuso alla fine? Funziona su entrambi i Korn Shell 88 e 93.

+4

Quale shell stai usando? –

+0

che shell? a zsh non piace :) – Doon

+1

Questo non viene eseguito correttamente con 'bash' (tre versioni differenti), bash-as-sh o' csh' per me. –

risposta

1

Questa era (se intenzionale) una decisione presa da David Korn.

Non vi è alcun requisito per questo comportamento fatto da forze esterne - nessun requisito di compatibilità all'indietro; nessun motivo di conformità agli standard (per questo, POSIX sh non era ancora standardizzato quando uscì ksh88).

L'unica persona che può dare una risposta definitiva alla logica - se presente - dietro un comportamento non specificato (il comportamento non implementa o non infrange alcuna semantica documentata) è l'autore di queste shell.

+2

Questo ha tutti i segni distintivi di un bug nell'implementazione di 'ksh'; Non riesco a trovare alcun riferimento a questo comportamento nella pagina man, e altri esempi come 'echo" x' e 'echo \' ls' si comportano come ci si dovrebbe aspettare.Altre 'ksh' versione' pdksh' e 'mksh' anche don non mostrare questo comportamento) – Carpetsmoker

+0

Bug? Comportamento non documentato? Ancora una volta, solo una persona può dire, e probabilmente non è qui. Detto questo, hai ragione che un bug è probabile, e ho modificato la mia formulazione in modo appropriato. –

+1

Non è impossibile questo è intenzionale, ma mi sembra che un bug sia * molto * più probabile di quello strano e inconsistente è un comportamento intenzionale, l'analisi in 'sh_lex' è una funzione 1200 con un massimo di 8 livelli di nidificazione. È destinato ad avere alcuni bug ... Hai modificato il titolo della domanda, a proposito, e non è così semplice come "backtick non chiusi", il "" inizia prima dell'apice e viene chiuso * prima della fine del comando * ... Questo è sbagliato in ogni caso, e questo è * probabilmente * dove 'sh_lex()' viene confuso, in qualche modo ... – Carpetsmoker