/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
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

Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste