Sembra che si stia verificando un problema specifico di ksh88 che modifica le virgolette singole in virgolette doppie, ma solo in determinate situazioni che coinvolgono heredocs e sostituzione di comandi.ksh88 cambiando virgolette singole a virgolette all'interno di heredocs?
Ecco un esempio:
#!/bin/ksh
# This example works correctly
echo "Example 1:"
cat <<EOF
The 'quick' brown fox "jumped" over the lazy dog.
EOF
echo
# This example is broken
echo "Example 2:"
var=$(cat <<EOF
The 'quick' brown fox "jumped" over the lazy dog.
EOF)
echo "${var}"
echo
# This example works correctly
echo "Example 3:"
var=`cat <<EOF
The 'quick' brown fox "jumped" over the lazy dog.
EOF`
echo "${var}"
echo
Ed ecco l'output (si noti come esempio 2 è diverso):
Example 1:
The 'quick' brown fox "jumped" over the lazy dog.
Example 2:
The "quick" brown fox "jumped" over the lazy dog.
Example 3:
The 'quick' brown fox "jumped" over the lazy dog.
La '
a "
sostituzione sembra verificarsi prima l'esecuzione del comando. Nel contesto attuale, heredoc sta passando SQL a Oracle. Modificando '
a "
, le stringhe vengono convertite in identificatori, rompendo in tal modo l'SQL. Questo può anche essere osservato abilitando xtrace durante l'esecuzione del codice precedente.
Come posso impedire la conversione da '
a "
nello snippet di codice precedente senza utilizzare i backtick?
Edit: La trama si infittisce. La sostituzione della sostituzione di comando $(...)
con notazione inversa non sostituisce le virgolette singole con virgolette doppie. Quindi (facoltativo) domanda due: perché?
Il comportamento descritto sembra un bug. Cambiare back-ticks a '$ (...)' non dovrebbe cambiare il contenuto dell'output. Non puoi aggiornare a ['ksh93'] (http://www.kornshell.com/)? –
@JonathanLeffler - Se si tratta di un bug, sembra piuttosto pericoloso. Per quanto riguarda il passaggio a ksh93, non è necessariamente un'opzione. Lo script effettivo deve essere eseguito su più server AIX e Solaris di versioni diverse. Alcuni hanno ksh93, ma la maggior parte ha solo ksh88. –
@ AdrianFrühwirth - 'echo $ {var}' e 'echo" $ {var} "' producono gli stessi risultati in tutti i casi precedenti. Se abiliti xtrace '#!/Bin/ksh -x' puoi vedere il valore di' var' ancor prima che venga visualizzato. –