Hol is van a futó script?

Megint találtam valami furaságot. Adva van egy script:
/home/bubu/wkrx/proba-10/ipiapacs.sh

Csinálok hozzá egy symlinket a /home/bubu/bin könyvtárban:
/home/bubu/bin/ezaz -> /home/bubu/wkrx/proba-10/ipiapacs.sh

Mikor elindul a script, tudnom kéne pontosan hol is van, nosza $PWD
PWD = /home/bubu

ajaj, mit mond a $0
/home/bubu/bin/ezaz

Valójában pedig a /home/bubu/wkrx/proba-10/ipiapacs.sh fut.
Hogy lehet ezt az infót kinyerni a scriptben?

Hozzászólások

A readlink semmi mást nem csinál, mint a kapott paramétere alapján kifejti a teljes elérési utat. Lényegében a $0-ban már megvan a megoldás, csak nem úgy, ahogy látni szeretted volna. Éppen ezért, ha a readlink argumentumának valami mást adsz, akkor azt fejti ki. Az információ a $0-ban van, illetve relatív elérés esetén még a $PWD-ben.

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Mondtam, hogy a $0 tartalmazza az infót. Az ugyan igaz, hogy a $0 a hívás módját tartalmazza, de gondold csak végig, ha a híváskor valahogy rátalált a script-edre a rendszer, akkor most, ugyanebből az infóból újra meg lehet találni azt.

Arról van szó, hogy noha a symlink-kel hivatkoztál, az tartalmazza, hova is mutat. A tényleges script-re. A readlink ugyanígy végigmegy a symlink-ek láncolatán, s ahova eljutott - ez a script-ed -, annak a teljes elérési útját adja eredményül. Tehát nem kell máshol keresni a megfejtést, maga a $0 tartalmazza ezt az információt. Meg nyilván a symlink-ek láncolata, valamint relatív elérési út esetén a $PWD.

Próbáld ki példáil ezeket:

readlink -f .
readlink -f ..
readlink -m ../alma/korte

Hátha ez segít. :)

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Igazad van! Az igazság, hogy a symlink/link a UNIX egyik kiváló eszköze, de én nagyon későn találkoztam vele, így néha nagyon rátudok csodálkozni dolgokra és roppant nehéz lesz a felfogásom :(
A /proc sokszor tesz nagyon jó szolgálatot, sőt inkább úgy kellene mondani, hogy ezek a UNIX/Linux spec fájlrendszerek (/dev /sys) és a bennük tárolt adatok.

* Én egy indián vagyok. Minden indián hazudik.

Konkrétan a fájlrendszerben tárolt adatokból szerzi a tudását, és nem is túl bonyolultan.
És itt ezzel a kérdéseddel együtt a fenti, költőinek szántra is választ adnék: ha értelmezni tudod az alábbi kódot, akkor jó úton vagy a shell eszközeinek megismeréséhez - ha nem, akkor is, csak többet kell tanulnod -, és láthatod, mennyire egyszerű kinyerni az infot:


$ touch file
$ ln -s file slink1
$ ln -s slink1 slink2

$ ls -l file slink1 slink2
-rw-r--r-- 1 lx lx 0 Jan 9 08:56 file
lrwxrwxrwx 1 lx lx 4 Jan 9 08:56 slink1 -> file
lrwxrwxrwx 1 lx lx 6 Jan 9 08:56 slink2 -> slink1

$ FILE=slink2; while ls -l $FILE | grep -q ^l ; do TARGET=`ls -l $FILE | awk '{print $NF}'`; echo "$FILE szimlink; cel: $TARGET"; FILE=$TARGET; done
slink2 szimlink; cel: slink1
slink1 szimlink; cel: file

A PWD az nem azt mutatja, hogy a scripted hol van, hanem hogy TE (a shell) hol allsz, amikor elinditod.
Ha pl. elinditom a home-ombol a /bin/pwd parancsot, akkor azt kapom, hogy pl.: /home/nyos, es nem azt, hogy /bin, pedig a pwd parancs a /bin-ben van.

--
There are free things in life i'll never understand
Spelling and counting

pwd stands for print working directory and takes two options. -L displays your logical path and is the default. -P displays your physical location, which may differ from your logical path if you have followed a symbolic link.