Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: mikk0 - 12.02.06 - klo:15.00
-
Ongelmia tuottaa seuraava skriptinpätkä:
#!/bin/bash
# skripti käynnistettävien ja sammutettavien palvelujen näyttämiseksi
# (c) GPL Mikko Saarinen 12.2.2006
echo "Järjestelmässä käynnistettävät palvelut eri ajotasoilla"
for i in S 1 2 3 4 5 6 0
do
echo "----------"
echo "Ajotaso $i"
cd /etc/rc"$i".d/
echo "----------"
echo "Käynnistyvät palvelut"
echo "`ls /etc/rc$i.d/S* | sed -e s+/etc/rc$1.d/S++`"
done
Tässä tuon sed-komennon pitäisi tiputtaa rivin alusta pois /etc/rc2.d/S -kaltaiset merkkijonot, mutta sitä se ei tee.
Komentoriviltä tämä toimii hyvin, miksi siis ei skriptissä?
Nuo lainausmerkit (") tarvitaan jotta echo ei söisi kaikkia rivinvaihtoja tulosteesta.
Toinen kysymysmerkki on tuo ls-käskyn -L vipu (--dereference). Suomennetun man-sivun mukaan Listaa symboolisten linkkien osoittamat tiedostot linkin sisällön sijaan.
Eli käskyn ls -L /etc/rc2.d/S13gdm pitäisi tuottaa tulokseksi käsittääkseni /etc/init.d/gdm, mutta näin se ei tee. Miksiköhän?
Niin ja jos joku ihmettelee miksi tällaista skriptiä rakennan, niin katsokaa tämä http://forum.ubuntu-fi.org/index.php?topic=1723.msg13465#msg13465
Mikko Saarinen
-
ok, myönnän suoraan, että en ole ihan varma mitä olet hakemassa, mutta...
echo "`ls /etc/rc$i.d/S* | sed -e s+/etc/rc$1.d/S++`"
siis, tarvitaankos tuossa tuota echoa ollenkaan? ja yritätkös sinä tuossa käyttää sedissä samaa muuttujaa kuin ls:ssä? eli toimisiko esim. seuraava rivi paremmin:
ls /etc/rc$i.d/S* | sed -e s+/etc/rc$i.d/S++
Toinen kysymysmerkki on tuo ls-käskyn -L vipu (--dereference). Suomennetun man-sivun mukaan Listaa symboolisten linkkien osoittamat tiedostot linkin sisällön sijaan.
Eli käskyn ls -L /etc/rc2.d/S13gdm pitäisi tuottaa tulokseksi käsittääkseni /etc/init.d/gdm, mutta näin se ei tee. Miksiköhän?
ei se taida listata linkin kohdetta vaan sen ominaisuudet jotka tietysti ratkaisevat montakin asiaa. se huomaan jos käyttää myös parametria -l:
$ ls -lL /etc/rc2.d/S13gdm
-rwxr-xr-x 1 root root 2375 2005-10-04 17:46 /etc/rc2.d/S13gdm
$ ls -l /etc/rc2.d/S13gdm
lrwxrwxrwx 1 root root 13 2005-11-08 18:48 /etc/rc2.d/S13gdm -> ../init.d/gdm
-
Ongelmia tuottaa seuraava skriptinpätkä:
[...]
Sinulla on sed-lauseessa $1 kun siellä pitäisi olla $i. Lisäksi tuossa ei tarvita echoa ja hieman ylempänä skriptissä oleva cd-komento on turha.
#!/bin/bash
# skripti käynnistettävien ja sammutettavien palvelujen näyttämiseksi
# (c) GPL Mikko Saarinen 12.2.2006
echo "Järjestelmässä käynnistettävät palvelut eri ajotasoilla"
for i in S 1 2 3 4 5 6 0
do
echo "----------"
echo "Ajotaso $i"
echo "----------"
echo "Käynnistyvät palvelut"
ls /etc/rc$i.d/S* | sed -e s+/etc/rc$i.d/S++
done
Eli käskyn ls -L /etc/rc2.d/S13gdm pitäisi tuottaa tulokseksi käsittääkseni /etc/init.d/gdm, mutta näin se ei tee. Miksiköhän?
Janne jo tuohon vastasikin mutta jos haluat kuvaamasi kaltaisen toiminnallisuuden niin komento "readlink -f" tekee haluamasi. Se on myös kätevä jos pitää muuttaa suhteellisia polkuja absoluuttisiksi.
-
skriptissä oleva cd-komento on turha.
tuon missasinkin kokonaan. itse asiassa jos koodissa on mukana tuo cd, niin tuon ls | sed hässäkän voi halutessaan korvata ihan pelkällä komennolla ls -1 S*, jolloin toiminta on täsmälleen samanlaista.
-
Kiitos ;D
Tässä näköjään tulee kirjoiteltua vähän mitä sattuu.
Tuo cd jäi siihen vahingossa kun aloitin sitä kautta. Enpä itse huomannut myöskään tuota $1:n lipsahtamista väärään paikkaan.
Se mitä hain, oli että listaus olisi näyttänyt pelkästään nuo tiedostot ilman polkua. Ja niinhän se muuten tekeekin jos sen ajaa PWD:stä käsin. Eli juuri niin kuin janne sanoi, niin cd jää koodiin, mutta sed saa lähteä.
Mikko
-
Jotenkin näin sen olisi siis pitänyt mennä:
#!/bin/bash
# skripti käynnistettävien ja sammutettavien palvelujen näyttämiseksi
# (c) GPL Mikko Saarinen 12.2.2006
echo "Järjestelmässä käynnistettävät palvelut eri ajotasoilla"
for i in S 1 2 3 4 5 6 0
do
echo "------------"
echo "Ajotaso $i"
cd /etc/rc"$i".d/
echo "----+-------"
KAIKKI=`ls -m S*`
echo 'Nro | Palvelu'
echo "----+--------"
for j in $KAIKKI
do
NRO=`echo $j | cut -c2,3`
PALVELU=`echo $j | cut -c4-`
echo "$NRO | $PALVELU"
done
done
Tuo antaa tällaista tulostetta:
mikko@Ubu:~/testi$ listservices
Järjestelmässä käynnistettävät palvelut eri ajotasoilla
...
------------
Ajotaso 6
----+-------
Nro | Palvelu
----+--------
01 | linux-restricted-modules-common,
20 | sendsigs,
30 | urandom,
31 | umountnfs.sh,
35 | networking,
36 | ifupdown,
40 | umountfs,
90 | reboot
------------
...
Jostain syystä ei näytä tässä niin tyylikkäältä kuin pääteikkunassa :)
Mikko
-
Jotenkin näin sen olisi siis pitänyt mennä:
[...]
Tarjoan sinulle vielä omaa näkemystäni jossa käytetään sed:iä sisemmän for-silmukan ja cut-komentojen sijasta.
#!/bin/bash
# skripti käynnistettävien ja sammutettavien palvelujen näyttämiseksi
# (c) GPL Mikko Saarinen 12.2.2006
echo "Järjestelmässä käynnistettävät palvelut eri ajotasoilla"
for i in S {1..6} 0
do
echo "-------------"
echo "Ajotaso $i"
echo "----+--------"
echo 'Nro | Palvelu'
echo "----+--------"
cd /etc/rc"$i".d/
ls S* | sed 's/^.\(..\)/\1 | /'
done
-
No tuohan näyttää paljon paremmalta :)
Yksinkertainen on kaunista.
Muutin muuten tuota alkuperäistä otsikkoa jotta tämä aihe näkyisi hieman kuvaavammalla nimellä...
Mikko