|
| Symlinked sh script skal udføres som Tcl Fra : John |
Dato : 22-01-08 16:02 |
|
Det kan lyde lidt kryptisk men forklaring som følger.
Jeg køre Tcl på mine servere men de kan have variabel Tcl fortolker
(liggende forskellige steder på mine servere).
Min runme.sh fil (den som brugerne køre) er defineret som et symlink i
/usr/sbin/runme.sh - den peger p.t. på /mydist/script/runme.sh men denne
mappe kan også være variabel.
Tcl fortolkeren er defineret i filen $runme../where.txt (altså én mappe over
runme.sh scriptet).
Altså:
/usr/sbin/runme.sh -> /mydist/script/runme.sh
/mydist/where.txt
/mydist/script/runme.sh
Indholdet af where.txt:
tcldir /opt/tcl8.4
Starten af min runme.sh script er:
#!/bin/sh
# the next line restarts using tclsh \
exec /opt/tcl8.4/bin/tclsh "$0" "$@"
puts "Dette er en test"
Hele humlen i mit problem ligger i, at jeg skal have erstattet [exec
/opt/tcl8.4/bin/tclsh "$0" "$@"] linien med én som fungere uafhængig af hvor
symlinken ligger samt at den indlæser hvor Tcl fortolkeren ligger.
/bin/sh antager jeg er tilgængelig på alle Red Hat Linux distros?
| |
John (23-01-2008)
| Kommentar Fra : John |
Dato : 23-01-08 10:18 |
|
> Altså:
> /usr/sbin/runme.sh -> /mydist/script/runme.sh
> /mydist/where.txt
> /mydist/script/runme.sh
>
> Indholdet af where.txt:
> tcldir /opt/tcl8.4
>
> Starten af min runme.sh script er:
> #!/bin/sh
> # the next line restarts using tclsh \
> exec /opt/tcl8.4/bin/tclsh "$0" "$@"
> puts "Dette er en test"
Er der slet ingen bud på denne? Jeg havde selv tænkt på at man kunne greppe
symlink destination, /mydist/script/runme.sh, og strippe filnavn og én mappe
oppe = /mydist. Det skal så give én eller anden linie som skal køres direkte
med exec, men det kan jeg ikke få til at virke.
Noget a'la denne pshedo kode:
exec `ls -l $0 | awk {print $11} | grep "tcldir " "$0" "$@"
"ls -l $0" giver følgende resultat:
lrwxrwxrwx 1 root root 16 Mar 20 2007 runme.sh -> /mydist/scripts/runme.sh
| |
Peter Makholm (23-01-2008)
| Kommentar Fra : Peter Makholm |
Dato : 23-01-08 10:36 |
|
"John" <s67890@REMOVE.gmail.com> writes:
> Er der slet ingen bud på denne?
Det var ikke helt kalrt for mig hvad du prøvede på.
> Noget a'la denne pshedo kode:
>
> exec `ls -l $0 | awk {print $11} | grep "tcldir " "$0" "$@"
Jeg er ikke sikker på at det kan gøres kønt. Følgende er helt uprøvet
og muligvis end ikke det kønneste man kan forestille sig:
exec $( grep "^tcldir" "$(dirname $(readlink $0))/../where.txt" | cut -d" " -f2) "$0" "$@"
Dette burde virke på enhver linux.
//Makholm
| |
Peter Makholm (23-01-2008)
| Kommentar Fra : Peter Makholm |
Dato : 23-01-08 13:58 |
|
"John" <s67890@REMOVE.gmail.com> writes:
>> Jeg er ikke sikker på at det kan gøres kønt.
>
> Det er knapt så vigtigt - dog bare det fungere.
Problemet er hvis nogen skal vedligeholde det om 14 dage. Jeg ville
nok være noget forbeholden over for denne løsning, for jeg vil ikke
kunne vedligeholde det om 14 dage.
Hvis tricket med at få det til både at være et validet shell script og
et validt tcl-script ikke er meget standard ville jeg også dokumentere
det.
Nuvel, til dit problme:
>> Følgende er helt uprøvet og muligvis end ikke det
>> kønneste man kan forestille sig:
>> exec $( grep "^tcldir" "$(dirname $(readlink $0))/../where.txt" | cut -d"
>> " -f2) "$0" "$@"
>> Dette burde virke på enhver linux.
>
> Det virker upåklageligt, så længe man kalder "runme.sh". Hvis man køre
> scriptet direkte fra /mydist/script/runme.sh kommer følgende fejl:
Ja, for når readlink kaldes på noget der ikke er et symlink, skriver
den ikke noget ud men returnerer en fejl. Det er der to løsninger på:
exec $( grep "^tcldir" "$(dirname $(readlink -f $0))/../where.txt" | cut -d" " -f2) "$0" "$@"
eller
exec $( grep "^tcldir" "$(dirname $(readlink $0 || echo $0))/../where.txt" | cut -d" " -f2) "$0" "$@"
Den første er måske pænest rent visuelt, men den anden vil også virke
på freebsd.
//Makholm
| |
Thorbjørn Ravn Ander~ (23-01-2008)
| Kommentar Fra : Thorbjørn Ravn Ander~ |
Dato : 23-01-08 15:52 |
|
Peter Makholm <peter@makholm.net> writes:
> Hvis tricket med at få det til både at være et validet shell script og
> et validt tcl-script ikke er meget standard ville jeg også dokumentere
> det.
> exec $( grep "^tcldir" "$(dirname $(readlink $0 || echo $0))/../where.txt" | cut -d" " -f2) "$0" "$@"
Man kan komme ret langt ved i ovenstående at putte resultaterne af $()
kald i en variabel navngiven efter resultatet.
RESOLVEDSCRIPTNAME=$(readlink $0 || echo $0) # if not symlink, just use original name
BINDIR=$(dirname "$RESOLVEDSCRIPTNAME")
osv osv
--
Thorbjørn Ravn Andersen
| |
Peter Makholm (23-01-2008)
| Kommentar Fra : Peter Makholm |
Dato : 23-01-08 16:02 |
|
nospam0000@gmail.com (Thorbjørn Ravn Andersen) writes:
>> exec $( grep "^tcldir" "$(dirname $(readlink $0 || echo $0))/../where.txt" | cut -d" " -f2) "$0" "$@"
>
> Man kan komme ret langt ved i ovenstående at putte resultaterne af $()
> kald i en variabel navngiven efter resultatet.
Nu kender jeg ikke tcl, så jeg ved ikke rigtigt hvilke tricks man kan
bruge så tcl ser filen som et rigtigt tcl-script. Og så er det en
vurdering om man vil have en enkelt übermystisk linje eller om man vil
have en række linjer der *alle* skal afsluttes med '# \'.
//Makholm
| |
Peter Makholm (23-01-2008)
| Kommentar Fra : Peter Makholm |
Dato : 23-01-08 16:06 |
|
"John" <s67890@REMOVE.gmail.com> writes:
>> exec $( grep "^tcldir" "$(dirname $(readlink -f $0))/../where.txt" |
>> cut -d" " -f2) "$0" "$@"
>
> Igen, denne virker perfekt. Mange tak - afholder du script programmerings
> kurser?
Det var så lidt, en udfordring er altid sjov.
Der er (desvære) meget stor forskel på at kende sin værktøjskasse og
kunne udnytte den til at løse konkrete problemer og så at lære fra
sig.
//Makholm
| |
|
|