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