Vraag Hoe te controleren of een opdracht is gelukt?


Is er een manier om te controleren of er een fout is bij het uitvoeren van een opdracht?

Voorbeeld:

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

Ik heb al geprobeerd om dat te doen, maar het lijkt erop dat het niet werkt. Ik doe niet hoe dat te doen.


159
2018-03-07 11:40


oorsprong


Verkiezen $ (Foo) over backticks `foo`, omdat je het kunt nesten en het gemakkelijker is om te onderscheiden van apostrofs. - user unknown
Tussen haakjes, je moet een functie definiëren (valid) voordat je het belt. - wjandrea


antwoorden:


De retourwaarde wordt opgeslagen in $?. 0 geeft succes aan, andere geeft een fout aan.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Net als elke andere tekstuele waarde kunt u deze in een variabele opslaan voor toekomstige vergelijking:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Zie voor mogelijke vergelijkingsexploitanten man test.


238
2018-03-07 12:06



Dat is leuk ... kan ik de output-fout houden ?? !! , omdat ik in dit geval 2 fouten heb: opdrachtfout "tekst" ex, bestand niet gevonden en mijn fout "tekst" Wat is in dit geval bijvoorbeeld mislukt - moata_u
@moata_u: u kunt de waarde in een variabele opslaan zoals getoond in mijn antwoord. - Lekensteyn
@moata_u: je moet een ; voor de else en fi: `if ...; dan ...; anders ...; fi - Lekensteyn
Dit is een nutteloos gebruik van test. - David Foerster
@Blauhirn [ $? ] (of equivalent, test $?) werkt niet omdat $? evalueert naar een getal (0, 1, etc.) dat niet nul is. Zie de docs voor test: "Als EXPRESSION is weggelaten, geeft 'test' false als EXPRESSION een enkel argument is, retourneert 'test' false als het argument ongeldig en waar is. ' - Lekensteyn


Als u alleen wilt weten of de opdracht is geslaagd of mislukt, test dan niet $?, test gewoon het commando rechtstreeks. bijv .:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

En het toewijzen van de uitvoer aan een variabele verandert de retourwaarde niet (nou ja, tenzij het anders gedraagt ​​als stdout natuurlijk geen terminal is).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals legt uit if meer gedetailleerd.


60
2018-03-08 23:54



Wat als u iets anders wilt doen dan vertakkingen zoals het opslaan van de booleaanse waarde of deze al of niet is gelukt in een .ini? Dan doet je outputvariabele dat niet, maar $? wel, dus je hebt het fout om te zeggen dat het rechtstreeks testen van de opdracht strikt beter is. - Timothy Swan


command && echo OK || echo Failed

19
2017-12-01 21:19



Als command retourneert een fout op het scherm, hoe kan dit worden verborgen? - Sigur
Als command schrijft fouten naar stderr, u kunt het formulier gebruiken command 2> /dev/null && echo OK || echo Failed. De 2> /dev/null stuurt stderr-uitvoer om naar /dev/null. Sommige hulpprogramma's schrijven echter fouten naar stdout (ook al is dit een slechte praktijk). In dit geval kunt u de 2 weglaten uit de omleiding, maar verliest u elke uitvoer van de opdracht. Deze methode om succes te controleren is goed voor eenvoudige ternaire logica, maar voor meer complex gedrag is het het beste om te controleren $? voor opdrachtsucces, of gebruik de if blokmethode beschreven in @ geirha's antwoord. - Bender the Greatest


$? zou de exit-status van de vorige opdracht moeten bevatten, die nul zou moeten zijn voor geen fout.

Dus, zoiets als;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

in de meeste gevallen is het eenvoudiger om & & construct te gebruiken om opdrachten te ketenen die van elkaar afhankelijk moeten zijn. Zo cd /nonexistant && echo success! zou niet echo succes omdat het bevel vóór && breekt. Het logisch gevolg hiervan is ||, waar cd /nonexistant || echo fail  zou echo mislukt omdat cd mislukt. (dit wordt handig als u zoiets als || exit gebruikt, waardoor het script wordt beëindigd als de vorige opdracht is mislukt.)


12
2018-03-07 12:04



Dat is leuk ... kan ik de output-fout houden ?? !! , omdat ik in dit geval 2 fouten heb: opdrachtfout "tekst" ex, bestand niet gevonden en mijn fout "tekst" Wat is in dit geval bijvoorbeeld mislukt - moata_u
@moata_u, zie mywiki.wooledge.org/BashFAQ/002 - geirha


command && echo $? || echo $?

4
2017-08-12 16:01





Voor foutcontrole jouw opdrachten:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

geinspireerd in Lean-productie:


2
2017-12-29 04:20





het zou genoteerd moeten worden dat if...then...fi en &&/|| type benadering gaat over de exit-status geretourneerd door het commando dat we willen testen (0 over succes); Sommige opdrachten retourneren echter geen niet-nulstatus als de opdracht is mislukt of de invoer niet kon verwerken. Dit betekent dat het gebruikelijke if en &&/|| benaderingen werken niet voor die specifieke opdrachten.

Bijvoorbeeld, op Linux GNU file wordt nog steeds afgesloten met 0 als het een niet-bestaand bestand heeft ontvangen als argument en find kon de opgegeven bestandsgebruiker niet vinden.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

In dergelijke gevallen is een mogelijke manier om de situatie aan te pakken, door te lezen stderr/stdin berichten, b.v. degenen die terugkeerden file commando, of ontleed de uitvoer van het commando zoals in find. Voor dat doel case verklaring zou kunnen worden gebruikt.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Dit is een repost van mijn eigen antwoord op gerelateerde vraag op unix.stackexchange.com )


0
2017-11-13 18:58





Zoals vermeld in veel andere antwoorden, een eenvoudige test van $? zal doen, zoals dit

if [ $? -eq 0 ]; then something; fi

Als je wilt testen of het commando mislukt, je kunt een kortere versie gebruiken in bash (maar misschien overdreven) als volgt:

if (($?)); then something; fi

Dit werkt door de (( )) rekenkundige modus, dus als de opdracht terugkeert success, i.e. $? = 0 dan evalueert de test naar ((0)) welke test als false, anders zal het terugkeren true.

Om te testen succes, je zou kunnen gebruiken:

if ! (($?)); then something; fi

maar het is al niet veel korter dan het eerste voorbeeld.


0
2017-08-16 21:07