2014-08-29 17 views
9

Wygląda na to, że napotykam problem specyficzny dla ksh88, który zmienia pojedyncze cudzysłowy na podwójne, ale tylko w pewnych sytuacjach związanych z heredoc i podstawianiu poleceń.ksh88 zmiana pojedynczych cudzysłowów na podwójne cudzysłowy wewnątrz heredocs?

Oto przykład:

#!/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 

A oto wyjście (zauważ jak Przykład 2 jest inny):

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. 

' do " podstawienie wydaje się występować przed tras poleceń. W rzeczywistym kontekście heredoc przekazuje SQL do Oracle. Zmieniając ' na ", ciągi są konwertowane na identyfikatory, co powoduje przerwanie SQL. Można to również zaobserwować, włączając xtrace podczas wykonywania powyższego kodu.

Jak mogę zapobiec konwersji ' do " w powyższym fragmencie kodu bez użycia odrzuceń?


Edit: Działka zgęstnieje. Zastąpienie polecenia substytutem $(...) notacją zwrotną nie zastępuje pojedynczych cudzysłowów podwójnymi cudzysłowami. Tak (opcjonalnie) pytanie drugie: dlaczego?

+3

Opisane zachowanie brzmi jak błąd. Zmiana tyknięć z powrotem na '$ (...)' nie powinna zmieniać zawartości wyniku. Nie możesz uaktualnić do ['ksh93'] (http://www.kornshell.com/)? –

+0

@ JonathanLeffler - Jeśli jest to błąd, wygląda całkiem nieźle. Jeśli chodzi o przełączanie się na ksh93, niekoniecznie jest to opcja. Rzeczywisty skrypt musi działać na wielu serwerach AIX i Solaris w różnych wersjach. Kilka ma ksh93, ale większość ma tylko ksh88. –

+0

@ AdrianFrühwirth - "echo $ {var}" i "echo" $ {var} "' dają takie same wyniki we wszystkich powyższych przypadkach. Jeśli włączysz xtrace '#!/Bin/ksh -x', zobaczysz wartość' var', nawet zanim zostanie wyświetlona. –

Odpowiedz

5

Oto moje notatki, kiedy odkryłem ten sam błąd kilka lat temu.

skrypt testowy:

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

wyjścia dla różnych skorup:

  • Linux KSH Wersja M 28.12.1993 q
  • Linux Bash 3,00.15 (1)

(UWAGA: zgodnie z oczekiwaniami)

/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
  • AIX wersja K-11/16/88f
  • Solaris wersja K-11/16/88i

(UWAGA: pojedyncze cudzysłowy zastąpione podwójnymi cudzysłowami i zmiennymi nie podstawionymi)

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

obejście:

  1. Oblicz pojedynczym cudzysłowie zewnętrznie od tutaj akt

    abc=xyz 
    STR="'$abc'" 
    x=$(cat <<EOF 
        $abc "$abc" $STR 
    EOF 
    ) 
    
  2. Korzystanie tu plik w funkcji zamiast bezpośrednio

    fn() { 
        cat <<EOF 
        $abc "$abc" '$abc' 
    EOF 
    } 
    abc=xyz 
    x=$(fn) 
    
Powiązane problemy