← Back to team overview

sslug-teknik team mailing list archive

Re: Bash-mystik - eller er det xview der driller ?

 

Jan Holst Jensen wrote:
fra find(1):

-print0
   True; print the full file name on the standard
output,  followed
   by  a  null  character  (instead  of  the
newline character that
   `-print' uses).  This allows file names that


OK, jeg begynder at se den fordrejede logik bag det
her. Jeg kørte nedenstående

  PARAMS=`for image in *.jpg; do echo \"$image\";
done`

  echo "Liste-udgave"
  echo "$PARAMS"
  echo

  echo "One-liner udgave"
  echo $PARAMS
  echo

og får følgende output

  Liste-udgave
  "01 jan.jpg"
  "02 feb.jpg"

  One-liner udgave
  "01 jan.jpg" "02 feb.jpg"

så `cmd` returnerede noget ganske andet end jeg naivt
forventede. OK, for at være sikker på at have en ren
tekststreng i min variabel gjorde jeg dette:

  $ PARAMS1="\"01 jan.jpg\""
  $ PARAMS2="\"02 feb.jpg\""
  $ PARAMS="$PARAMS1 $PARAMS2"
  $ echo $PARAMS
  "01 jan.jpg" "02 feb.jpg"

men jeg kan stadig ikke bruge den simpelt med en anden
kommando:

  $ ls -l $PARAMS
  /bin/ls: "01: No such file or directory
  /bin/ls: jan.jpg": No such file or directory
  /bin/ls: "02: No such file or directory
  /bin/ls: feb.jpg": No such file or directory

  $ ls -l "$PARAMS"
  /bin/ls: "01 jan.jpg" "02 feb.jpg": No such file or
directory

Det eneste der virker er
  $ echo $PARAMS | xargs ls -l
  -rw-r--r--  1 vmware users 0 2005-12-01 18:45 01
jan.jpg
  -rw-r--r--  1 vmware users 0 2005-12-01 18:45 02
feb.jpg

Så dobbelt-pingede navne bliver altså opfattet vidt
forskelligt afhængigt af hvordan man lige sender dem
rundt. Nogle gange synes bash at ting inde i
dobbelt-pinger skal sendes direkte videre og andre
gange fortolker den og deler op på mellemrum uagtet at
navnene er beskyttet af dobbelt-pinger.

Det kan godt være at det er konsistent opførsel, men
det er altså dybt ulogisk. Er der nogen der kan give
en logisk sammenhængende forklaring på bash's opførsel
? Eller er svaret bare: Skriv alle dine scripts i
Python :-) ?

Det er vist på tide at tydeliggøre brugen af bagvendt skråstreg (back slash). I kildeprogramtekster (Shell-scripts, C, PHP, Python, osv.) skal tekststrenge markeres med anførselstegn. Disse anførselstegn indgår ikke i teksten. Hvis tekststrengen reelt skal indeholde et anførselstegn, bruges en back slash.
Eks. "Dette er en tekst med anførselselstegn \" inkluderet".
Hvis \ udelades bliver teksten spoleret.
Så er der filer med mellemrun i navnet, f.eks. 01 januar.jpg
Et sådant filnavn skal, for at opfattes som ét navn, markeres med anførselstegn: ls "01 januar.jpg". Hvis man skriver ls \"01 januar.jpg\" betyder det at filnavnet stadig opfattes som to navne: "01 og januar.jpg". Konstruktionen ls "\"01 januar.jpg\"", resulterer i et filnavn med anførselstegn omkring, og den fil eksisterer ikke.


--
Med venlig hilsen
(\")
Jørgen Heesche
mailto:heesche@xxxxxxxxxxx
Registered Linux User #401007


Follow ups

References