Kirjoittaja Aihe: Which which?  (Luettu 2219 kertaa)

SuperOscar

  • Käyttäjä
  • Viestejä: 4059
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Which which?
« : 11.08.09 - klo:13.32 »
Kaikenlaista pikkukiusaa... *ubuntussa toimiva skriptini alkoi tökkiä openSUSEssa eri tavoin toimivan which-komennon takia.

Skripti alkaa loitsulla

Koodia: [Valitse]
#!/bin/sh
...joka tietysti sekin saatetaan tulkita eri järjestelmissä eri lailla, mutta periaatteessa kai niin, että käyttöön tulee kuori, jolla ei ole (?) sisäistä which-komentoa vaan käytetään /usr/bin/which-ohjelmaa. (Normikuoreni on zsh, jossa on sisäinen which, mutta bashissa tunnutaan käytettävän /usr/binin ohjelmaa myös *ubuntussa – tosin se on eri ohjelma, kuten alta nähdään.)

Skripti tarkistaa tarpeellisten ohjelmien olemassaolon näin:

Koodia: [Valitse]
if [ -z "`which spuunmux`" ]; then
    echo Nutistaan ohjelman puuttumisesta
fi

...mikä toimii *ubuntussa: which spuunmux palauttaa tyhjän jonon, jollei ohjelmaa löydy. openSUSEssa sen sijaan sama ei enää toimi, koska siellä which heltyy kaunopuheiseksi ja tiedottaa kaikki etsimänsä hakemistot, josta ohjelmaa ei ole löytänyt.

Olisiko ehdotusta, miten oikeasti pitäisi menetellä, kun haluaa tarkistaa ohjelman olemassaolon järjestelmässä?
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

UbunTux

  • Käyttäjä
  • Viestejä: 2046
  • KubunTux
    • Profiili
Vs: Which which?
« Vastaus #1 : 11.08.09 - klo:14.04 »
Koodia: [Valitse]
j-p@hilavitkutin:~$ which bash
/bin/bash
j-p@hilavitkutin:~$ echo $?
0
j-p@hilavitkutin:~$ which ei_mikään
j-p@hilavitkutin:~$ echo $?
1
j-p@hilavitkutin:~$
Entäs näin?
KDE neon
Uudempaa KDE:tä Ubuntulla

SuperOscar

  • Käyttäjä
  • Viestejä: 4059
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Which which?
« Vastaus #2 : 11.08.09 - klo:14.28 »
Tuo voisi toimia... jotenkin näin:

Koodia: [Valitse]
which spuunmux > /dev/null
if [ $? != 0 ]; then
    echo spuunmux puuttuu
fi

Kömpelöä kyllä :(
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Which which?
« Vastaus #3 : 11.08.09 - klo:15.24 »
Olisiko ehdotusta, miten oikeasti pitäisi menetellä, kun haluaa tarkistaa ohjelman olemassaolon järjestelmässä?

Jo ehdotettu paluuarvon tarkistaminen on mielestäni paras tapa päätellä which-komennon tulos. Tosin tuossa ongelmia aiheuttavassa skriptissä korjauksen voi tehdä myös ohjaamalla stderr-tulostuksen /dev/null:iin.

Koodia: [Valitse]
if [ -z "`which spuunmux 2>/dev/null`" ]; then
    echo Nutistaan ohjelman puuttumisesta
fi

Jos käytettäisiin paluuarvoa niin tarkistuksen voisi tehdä esimerkiksi näin:
Koodia: [Valitse]
if ! which spuunmux &>/dev/null; then
    echo Nutistaan ohjelman puuttumisesta
fi

« Viimeksi muokattu: 11.08.09 - klo:15.28 kirjoittanut mgronber »

aurinkolasit

  • Vieras
Vs: Which which?
« Vastaus #4 : 13.08.09 - klo:21.52 »
Kaikenlaista pikkukiusaa... *ubuntussa toimiva skriptini alkoi tökkiä openSUSEssa eri tavoin toimivan which-komennon takia.

Skripti alkaa loitsulla

Koodia: [Valitse]
#!/bin/sh
...joka tietysti sekin saatetaan tulkita eri järjestelmissä eri lailla, mutta periaatteessa kai niin, että käyttöön tulee kuori, jolla ei ole (?) sisäistä which-komentoa vaan käytetään /usr/bin/which-ohjelmaa. (Normikuoreni on zsh, jossa on sisäinen which, mutta bashissa tunnutaan käytettävän /usr/binin ohjelmaa myös *ubuntussa – tosin se on eri ohjelma, kuten alta nähdään.)

Skripti tarkistaa tarpeellisten ohjelmien olemassaolon näin:

Koodia: [Valitse]
if [ -z "`which spuunmux`" ]; then
    echo Nutistaan ohjelman puuttumisesta
fi

...mikä toimii *ubuntussa: which spuunmux palauttaa tyhjän jonon, jollei ohjelmaa löydy. openSUSEssa sen sijaan sama ei enää toimi, koska siellä which heltyy kaunopuheiseksi ja tiedottaa kaikki etsimänsä hakemistot, josta ohjelmaa ei ole löytänyt.

Olisiko ehdotusta, miten oikeasti pitäisi menetellä, kun haluaa tarkistaa ohjelman olemassaolon järjestelmässä?

Törmäsin samanlaiseen ongelmaan Arch Linuxissa. Siellä ongelma korjautui kun käytin $() rakennetta ja lainausmerkkejä.

Koodia: [Valitse]
# testaa josko $PATH/haluamasi_ohjelma on ajettava (executable)
# älä tulosta virheitä
# jos ei ole (!) ajettava, pyydä asentamaan ja poistu virheellä
# jos on ajettava, jatka_skriptiin
if [ ! -x "$(which haluamasi_ohjelma 2> /dev/null)" ]
then
        echo asenna haluamasi_ohjelma
        exit 1
else
         jatka_skriptiin
fi










« Viimeksi muokattu: 13.08.09 - klo:22.03 kirjoittanut aurinkolasit »