2014-08-29 9 views
9

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é?

+3

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/)? –

+0

@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. –

+0

@ 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. –

risposta

5

Ecco i miei appunti quando ho scoperto lo stesso bug diversi anni fa.

script di test:

#!/bin/ksh 
cat <<EOF 
    $PWD "$PWD" '$PWD' 
EOF 
echo `cat <<EOF 
    $PWD "$PWD" '$PWD' 
EOF 
` 
echo $(cat <<EOF 
    $PWD "$PWD" '$PWD' 
EOF 
) 

Uscita per diverse conchiglie:

  • Linux KSH versione M 1993/12/28 q
  • Linux Bash 3.00.15 (1)

(NOTA: funziona come previsto)

/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
  • AIX Version M-11/16/88F
  • Solaris versione M-11/16/88i

(NOTA: virgolette singole sostituite con virgolette doppie e variabile non sostituita)

/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" "$PWD" 

work-around:

  1. Calcola la stringa tra apici singoli esternamente dal qui-file di

    abc=xyz 
    STR="'$abc'" 
    x=$(cat <<EOF 
        $abc "$abc" $STR 
    EOF 
    ) 
    
  2. Utilizzare il qui-file in una funzione anziché direttamente

    fn() { 
        cat <<EOF 
        $abc "$abc" '$abc' 
    EOF 
    } 
    abc=xyz 
    x=$(fn) 
    
Problemi correlati