Kirjoittaja Aihe: Eri hakemistoissa olevien tiedostojen tulostamista valikoivasti [toimii]  (Luettu 5308 kertaa)

mikk0

  • Käyttäjä
  • Viestejä: 555
    • Profiili
Ongelmia tuottaa seuraava skriptinpätkä:
Koodia: [Valitse]
#!/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
« Viimeksi muokattu: 13.02.06 - klo:08.56 kirjoittanut mikk0 »

Mikko Saarinen

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Re: Putken käyttö echossa
« Vastaus #1 : 12.02.06 - klo:15.20 »
ok, myönnän suoraan, että en ole ihan varma mitä olet hakemassa, mutta...

Koodia: [Valitse]
  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:

Koodia: [Valitse]
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:

Koodia: [Valitse]
$ 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
Janne

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Re: Putken käyttö echossa
« Vastaus #2 : 12.02.06 - klo:16.44 »
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.

Koodia: [Valitse]
#!/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.


janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Re: Putken käyttö echossa
« Vastaus #3 : 12.02.06 - klo:16.55 »
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.
Janne

mikk0

  • Käyttäjä
  • Viestejä: 555
    • Profiili
Re: Putken käyttö echossa
« Vastaus #4 : 12.02.06 - klo:20.19 »
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

Mikko Saarinen

mikk0

  • Käyttäjä
  • Viestejä: 555
    • Profiili
Re: Putken käyttö echossa
« Vastaus #5 : 12.02.06 - klo:21.11 »
Jotenkin näin sen olisi siis pitänyt mennä:

Koodia: [Valitse]
#!/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:
Koodia: [Valitse]
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
« Viimeksi muokattu: 12.02.06 - klo:21.14 kirjoittanut mikk0 »

Mikko Saarinen

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Re: Putken käyttö echossa
« Vastaus #6 : 13.02.06 - klo:00.25 »
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.

Koodia: [Valitse]
#!/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
« Viimeksi muokattu: 13.02.06 - klo:00.38 kirjoittanut mgronber »

mikk0

  • Käyttäjä
  • Viestejä: 555
    • Profiili
Re: Putken käyttö echossa
« Vastaus #7 : 13.02.06 - klo:08.53 »
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
« Viimeksi muokattu: 13.02.06 - klo:08.56 kirjoittanut mikk0 »

Mikko Saarinen