Kontrola zápisu v Bashi

PavelP

Kontrola zápisu v Bashi
« kdy: 12. 09. 2013, 16:08:05 »
Ahoj, který zápis je správný?

Kód: [Vybrat]
aaa 2>/dev/null || echo "Příkaz \"aaa\" není v systému nainstalován!";
nebo

Kód: [Vybrat]
aaa 2>/dev/null | echo "Příkaz \"aaa\" není v systému nainstalován!";
Děkuji

PS: Jedná se o příkazovou řádku v linuxu
« Poslední změna: 13. 09. 2013, 10:22:23 od Petr Krčmář »


rob

Re:Kontrola zápisu
« Odpověď #1 kdy: 12. 09. 2013, 16:22:46 »
Kód: [Vybrat]
| - roura pro komunakaci mezi procesy
Kód: [Vybrat]
|| - logickej OR
Jinak takle vypada korektni kontrola.
Kód: [Vybrat]
hash aaa 2>/dev/null || {
    echo "aaa is not installed."
    exit 1
}

Sten

Re:Kontrola zápisu
« Odpověď #2 kdy: 12. 09. 2013, 16:41:22 »
Ani jeden.

Kód: [Vybrat]
aaa 2>/dev/null || echo "Příkaz \"aaa\" není v systému nainstalován!";
Vypíše „Příkaz "aaa" není v systému nainstalován!“, pokud příkaz „aaa“ není nainstalován nebo běhu selže (tedy může být nainstalován)

Kód: [Vybrat]
aaa 2>/dev/null | echo "Příkaz \"aaa\" není v systému nainstalován!";
Vypíše „Příkaz "aaa" není v systému nainstalován!“, pokud příkaz „aaa“ v systému nainstalován je

Správné řešení je ten příkaz zkusit nalézt:

Kód: [Vybrat]
which aaa || echo "Příkaz \"aaa\" není v systému nainstalován!"

rob

Re:Kontrola zápisu
« Odpověď #3 kdy: 12. 09. 2013, 16:45:14 »

Správné řešení je ten příkaz zkusit nalézt:

Kód: [Vybrat]
which aaa || echo "Příkaz \"aaa\" není v systému nainstalován!"

Tak to bych nedoporucoval
viz http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script

PavelP

Re:Kontrola zápisu
« Odpověď #4 kdy: 12. 09. 2013, 16:55:24 »
Jinak takle vypada korektni kontrola.
Kód: [Vybrat]
hash aaa 2>/dev/null || {
    echo "aaa is not installed."
    exit 1
}

A co dělá ten hash? před tím příkazem?


rob

Re:Kontrola zápisu
« Odpověď #5 kdy: 12. 09. 2013, 17:12:52 »
je to build-in fce bashe (konkretni implementace vaseho shellu, teda aspon predpokladam, ze pouzivate BASH)
Jednoduse si nakesuje absolutni cestu k souboru. Dulezite je ale posledni veta v dokumentaci:

Kód: [Vybrat]
hash [-lr] [-p filename] [-dt] [name]
    For each name, the full file name of the command is determined by searching the directories in $PATH and remembered. If the -p option is supplied, no path search is performed, and filename is used as the full file name of the command. The -r option causes the shell to forget all remembered locations. The -d option causes the shell to forget the remembered location of each name. If the -t option is supplied, the full pathname to which each name corresponds is printed. If multiple name arguments are supplied with -t, the name is printed before the hashed full pathname. The -l option causes output to be displayed in a format that may be reused as input. If no arguments are given, or if only -l is supplied, information about remembered commands is printed. The return status is true unless a name is not found or an invalid option is supplied.
[code/]

Je tu jasne definovane chovani, kdyz ne/najde soubor na FS.

PavelP

Re:Kontrola zápisu
« Odpověď #6 kdy: 12. 09. 2013, 17:16:59 »
Je tu jasne definovane chovani, kdyz ne/najde soubor na FS.
Můžeš mi prosím napsat na marttpet@seznam.cz ? Díky

Re:Kontrola zápisu
« Odpověď #7 kdy: 12. 09. 2013, 17:35:13 »
A to chceš vědět, zda je daný binár v systému vůbec nainstalovaný, anebo jen zda je spustitelný s aktualním nastavenám PATH?

rob

Re:Kontrola zápisu
« Odpověď #8 kdy: 12. 09. 2013, 17:37:00 »
Postradas zaklady. Najdi si tady na root.cz nejaky serial o BASHi. Potom pochopis, ze uz ti psat vic nemusim.

PavelP

Re:Kontrola zápisu
« Odpověď #9 kdy: 12. 09. 2013, 17:41:36 »
A to chceš vědět, zda je daný binár v systému vůbec nainstalovaný, anebo jen zda je spustitelný s aktualním nastavenám PATH?
NN, to měl byt jen jako příklad, prostě nevím jak mít chyby pod kontrolou, jak při vytváření souborů, tak při spouštění vlastních funkci atd...

PavelP

Re:Kontrola zápisu v Bashu
« Odpověď #10 kdy: 12. 09. 2013, 20:26:52 »
Vážně nikdo neví?

nevi

Re:Kontrola zápisu v Bashu
« Odpověď #11 kdy: 12. 09. 2013, 21:37:50 »
Ne, nikdo neví o co ti jde?

One size fits all řešení pro ošetření chyb prostě neexistuje a už vůbec ne v BASHi respektive jakémkoliv shellu.

Re:Kontrola zápisu v Bashu
« Odpověď #12 kdy: 13. 09. 2013, 09:39:00 »
A to chceš vědět, zda je daný binár v systému vůbec nainstalovaný, anebo jen zda je spustitelný s aktualním nastavenám PATH?
NN, to měl byt jen jako příklad, prostě nevím jak mít chyby pod kontrolou, jak při vytváření souborů, tak při spouštění vlastních funkci atd...

Přiznám se, ani teď jsem to moc nepochopil.
Ale vezmu to z opačeného konce:
základem všeho je to, že když proces (funkce/program/skript) skončí bez chyby, tak vrací 0. (řečeno hodně zjednodušeně)
A to se dá (a taky se to tak dělá) testovat ...

[/quote]
Vážně nikdo neví?

Ví.
http://www.root.cz/knihy/bash-ocima-bohdana-milara/
http://www.tldp.org/guides.html#abs

cyberbobak

Re:Kontrola zápisu v Bashi
« Odpověď #13 kdy: 13. 09. 2013, 10:41:21 »
kazdy prikaz vracia exit kod, ten sa da zistit z premennej '$?', ked bol prikaz uspesny vzdu vrati hodnotu 0

StudentEN@STUDENT1042-12 ~
$ ls -la xxx
ls: cannot access xxx: No such file or directory

StudentEN@STUDENT1042-12 ~
$ echo $?
2

StudentEN@STUDENT1042-12 ~
$ touch xxx

StudentEN@STUDENT1042-12 ~
$ ls -la xxx
-rw-r--r-- 1 StudentEN None 0 Sep 13 10:34 xxx

StudentEN@STUDENT1042-12 ~
$ echo $?
0

Tvoj priklad:

aaa 2>/dev/null
(( $? ))  && echo "Příkaz není v systému nainstalován!"