Testaan erilaisia asioita bash-komentosarjoissa ja törmäsin ongelmaan, johon en voi saada selitystä.
Olen kirjoitetaan tarkoituksella väärä komento, jotta saadaan poistumiskoodi, joka poikkeaa 0: sta, mutta jotenkin näyttää siltä, että saan silti 0.
Koodi, jonka suoritan, on:
USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}"
Koodini lähtö on:
id: vaihtoehto tuntematon – s
Yritä ”id –help” saadaksesi lisätietoja.
Komennon suorittaminen epäonnistui poistumiskoodilla 0
Käyttäjätunnuksesi on
Oletan, että jollakin tavalla se näyttää kaiku-komennon poistumiskoodin? Jopa, jos poistumiskoodi on 0, miksi se kirjoittaa if-käskyyn?
Jos se on asia, niin miten saan sen näyttämään todellisen poistumiskoodin, joka pitäisi näkyä?
Vastaa
Koodissasi if
-lausekkeessa poistumistila, joka saa painettu on testin poistumistila [[ ${?} -ne 0 ]]
. Arvo $?
on aina viimeksi suoritetun komennon poistumistila, ja testi lasketaan komennona, ainakin siltä osin kuin asetetaan arvon $?
sen tulokseen.
Jos haluat tulostaa id
-tilan poistumistilan, määritä se muuttujalle, jonka arvo ei muutu,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
test
…[[
on osaksh
-syntaksia ja suoritetaan osana tulkkia, mutta ei sisäänrakennettuna Vaikuttaa siltä, että tämä tulkin osa nollaa muistetun poistumiskoodin.echo
s? Olisin odottanut sen poistua ensimmäisen jälkeen eikä päästä toiseen.exit 1
-lausetta. Se lisättiin todennäköisesti myöhemmin.