Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: 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
#!/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:
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ä?
-
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?
-
Tuo voisi toimia... jotenkin näin:
which spuunmux > /dev/null
if [ $? != 0 ]; then
echo spuunmux puuttuu
fi
Kömpelöä kyllä :(
-
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.
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:
if ! which spuunmux &>/dev/null; then
echo Nutistaan ohjelman puuttumisesta
fi
-
Kaikenlaista pikkukiusaa... *ubuntussa toimiva skriptini alkoi tökkiä openSUSEssa eri tavoin toimivan which-komennon takia.
Skripti alkaa loitsulla
#!/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:
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ä.
# 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