Unterschied bash / ksh bei Here-Dokument

Hallo Experten,

ich bin gerade am Verzweifeln bei einem here-Dokument. Nach einigen Stunden Suche habe ich das Problem auf den eigentlcihen Kern reduziert. Ich möchte in einem here-Dokument ein Single-Quote literal verwenden (als Input fuer ein sqlplus-Script, daher brauche ich die Singlequotes als Stringterminator).

bash
Funktioniert wie erwartet. In der Ausgabe tauchen meine Singlequotes aus.

~ str=$(cat '@'
\> 'hallo'
\> EOF
\> )

~ echo "str ist jetzt "
  
**str ist jetzt**  

ksh
ksh macht Murks und ersetzt die Singlequotes durch Doublequotes (was mein SQL-Statement mehr als durcheinander bringt).

str=$(cat "
  
**str ist jetzt**  

Leider bin ich auf ksh angewiesen - beim Kunden kommt eben nur die ksh auf den Teller… :frowning: . Hat jemand eine Idee, wie ich das doofe Teil zur friedlichen Zusammenarbeit überreden kann?

gruss
bernhard

Hallo Bernhard,

ich bin gerade am Verzweifeln bei einem here-Dokument. Nach
einigen Stunden Suche habe ich das Problem auf den
eigentlcihen Kern reduziert. Ich möchte in einem here-Dokument
ein Single-Quote literal verwenden (als Input fuer ein
sqlplus-Script, daher brauche ich die Singlequotes als
Stringterminator).

ksh macht Murks und ersetzt die Singlequotes durch
Doublequotes (was mein SQL-Statement mehr als durcheinander
bringt).
echo "str ist jetzt "

str ist jetzt

Hat jemand eine Idee, wie ich
das doofe Teil zur friedlichen Zusammenarbeit überreden kann?

Ich habe leider auch keine richtige Idee, aber da sich sonst niemand meldet, hier meine Beobachtungen und Gedanken dazu:
Ich habe mir zweimal die Kornshell installiert, einmal bei Ubuntu (Feisty Fawn) und das andere Mal bei Mandriva (Spring 2007). Leider konnte ich den Fehler nicht nachvollziehen, bei mar wurde das Here-Dokument ordentlich ausgegeben, mit Singlequoten. Das kann natürlich daran liegen, dass es sich um eine verbesserte (veränderte?) Korn-Shell handelt, die nicht mehr 100% identisch mit der alten UNIX-Kornshell ist. Als mögliche Lösung fällt mir nur noch ein, die einleitende Endemarkierung selbst zu quoten, also z.B.

str=$(cat aber nur diese, nicht etwa auch das EOF am Ende. Das bewirkt, dass jegliche Ersetzung im Here-Dokument verhindert wird. Ob das bei dir möglich ist, weiss ich nicht, da ja eventuell dein Here-Dokument länger als angeführt ist und dort andere Ersetzungen durchgeführt werden müssen. Wenn nicht, einen Versuch ist es wert.
Ob das nun hilfreich war, wage ich ncht zu entscheiden.

Viel Erfolg
Klaus Bernstein

Hallo Klaus,
vielen Dank für deinen Tipp, ich werd ihn Montag gleich mal ausprobieren (zu Hause hab ich kein Solaris installiert).

gruss
bernhard

Hallo Klaus,

ich habs mal probiert -

Problem geloest
Hallo,

falls es jemandesn interessiert, das Problem hat sich geloest. Verwendet man anstatt des syntaktisch ‚saubereren‘ Konstrukts

 var=$( command ) 

die altmodischen Backticks

 var=`command` 

, funktioniert es auch unter Solaris/ksh.

gruss
bernhard

Backtick versus $(…)
Hallo Bernhard,

falls es jemandesn interessiert, das Problem hat sich geloest.

Na Glückwunsch…

Verwendet man anstatt des syntaktisch ‚saubereren‘ Konstrukts

var=$( command )

die altmodischen Backticks

var=command

, funktioniert es auch unter Solaris/ksh.

Vielleicht ist es zu lange her, dass ich die Korn-Shell gelernt habe, aber ich habe sowohl für die ksh als auch später für die bash die beiden Audrücke (oder Metazeichen)

`kommando`

und

$( kommando )

als gleichwertig angesehen. Ist das so, dass jetzt die Backticks als quasi „veraltet“ angesehen werden? ich benutze sie eigentlich immer noch in meinen wenigen Shell-Skripten, erstens aus Gewohnheit und zweitens, weil sie sich schneller tippen lassen.Aber das, was ich tue, mache ich eh für mich privat. Aber interessieren würde es mich schon mal.

Viele Grüsse
Klaus Bernstein

Hallo Klaus,

Vielleicht ist es zu lange her, dass ich die Korn-Shell
gelernt habe, aber ich habe sowohl für die ksh als auch später
für die bash die beiden Audrücke (oder
Metazeichen)

kommando

und

$( kommando )

als gleichwertig angesehen.

Das sollten sie auch sein (zumindest in meiner Vorstellung, die meisten System machen es ja auch richtig).

Ist das so, dass jetzt die
Backticks als quasi „veraltet“ angesehen werden? ich benutze
sie eigentlich immer noch in meinen wenigen Shell-Skripten,
erstens aus Gewohnheit und zweitens, weil sie sich schneller
tippen lassen.Aber das, was ich tue, mache ich eh für mich
privat. Aber interessieren würde es mich schon mal.

Veraltet war nicht im Sinne von „gibt es (bald) nicht mehr, bitte nicht mehr verwenden“ gemeint, aber das Klammerkonstrukt bietet schon einige Vorteile:

  • besser lesbar (selbst der Editor kann zur matchenden Klammer springen)
  • man kann i.d.R. auch mehrere $() schachteln, ohne dass man sich über Escapen der Sonderzeichen Sorgen machen muss (versuch das mal mit Backticks über mehr als 2 Ebenen)
  • auf manchen Systemen sind die Backticks so gut wie nicht von einfachen Quotes zu unterscheiden

Daher raten viele aktuelle Bücher zur Verwendung von $(). Scheint, dass sich manche Solaris-Eigenheit noch nicht bis zu den Autoren rumgesprochen hat.

gruss
bernhard

Ah ja, vielen Dank (owT.)
.