Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: SuperOscar - 11.08.09 - klo:13.32

Otsikko: Which which?
Kirjoitti: SuperOscar - 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ä?
Otsikko: Vs: Which which?
Kirjoitti: UbunTux - 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?
Otsikko: Vs: Which which?
Kirjoitti: SuperOscar - 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ä :(
Otsikko: Vs: Which which?
Kirjoitti: mgronber - 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

Otsikko: Vs: Which which?
Kirjoitti: aurinkolasit - 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