Konstigt med echo med kommando och sträng

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Konstigt med echo med kommando och sträng

Inlägg av Osprey »

Vad kommer det sig att två tillsynes likvärdiga kommandon ger olika resultat, iofs bara lite men ändå..??

Först ger vi kommandot (date) innan textsträngen:
magnus@homer:/etc# echo `date`"foo"
ons okt 1 12:08:22 CEST 2008foo
och då får vi alltså ett mellanslag mellan "okt" och "1".

Sedan ger vi kommandot "inne i" textsträngen
magnus@homer:/etc# echo "`date`foo"
ons okt 1 12:08:33 CEST 2008foo
och som synes så är det plötsligt två mellanslag mellan "okt" och "1"...

Jag begriper ingenting och förstår inte hur det här kan påverka de utskrifter som kommer från date. Kommandot kan väl inte rimligtvis veta om i vilken kontext det exekverar..???

[Edit] Jag såg att forumet rensar bort de dubbla mellanslagen och ersätter dem med ett. Men resultatet blir iallafall som det blir och ni kan prova själva.
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Konstigt med echo med kommando och sträng

Inlägg av Konservburk »

Osprey skrev:Vad kommer det sig att två tillsynes likvärdiga kommandon ger olika resultat, iofs bara lite men ändå..??
De inte inte likvärdiga kommandon, vilket du redan har märkt.
Osprey skrev:Jag begriper ingenting och förstår inte hur det här kan påverka de utskrifter som kommer från date. Kommandot kan väl inte rimligtvis veta om i vilken kontext det exekverar..???
Det stämmer att date inte vet någonting om detta. Saken är den att skalet utför så kallad "Word Splitting", dvs delar upp i ord för ord, med resultatet att det bara blir ett mellanrum mellan varje ord kvar. Från manualbladet:

Kod: Markera allt

   Word Splitting
       The shell scans the results of parameter expansion,  command  substitu-
       tion,  and arithmetic expansion that did not occur within double quotes
       for word splitting.
Om du har `date` inne i strängen så utförs aldrig någon "World Splitting", och resultatet blir som det hade blivit om du hade kört date löst:

Kod: Markera allt

$ date
Wed Oct  1 12:32:53 CEST 2008
$ echo "`date`"
Wed Oct  1 12:32:53 CEST 2008
$ echo `date`
Wed Oct 1 12:32:53 CEST 2008
Osprey skrev:Jag såg att forumet rensar bort de dubbla mellanslagen och ersätter dem med ett.
Använd

Kod: Markera allt

 så slipper du problemet.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Konstigt med echo med kommando och sträng

Inlägg av Konservburk »

Vi kan ju även ta ett exempel där "Word Splitting" spelar betydligt större roll än ett mellanrum som försvinner:

Kod: Markera allt

$ for i in "`date`"; do echo "$i"; done
Wed Oct  1 12:36:40 CEST 2008
$ for i in `date`; do echo "$i"; done
Wed
Oct
1
12:36:40
CEST
2008
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Konstigt med echo med kommando och sträng

Inlägg av Osprey »

Aha, tack så mycket för svaret, nu har jag lärt mig något nytt!! :D
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Skriv svar

Återgå till "Terminalforum"