Fórum Root.cz

Hlavní témata => Server => Téma založeno: PavelP 12. 09. 2013, 16:08:05

Název: Kontrola zápisu v Bashi
Přispěvatel: PavelP 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
Název: Re:Kontrola zápisu
Přispěvatel: rob 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
}
Název: Re:Kontrola zápisu
Přispěvatel: Sten 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!"
Název: Re:Kontrola zápisu
Přispěvatel: rob 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
Název: Re:Kontrola zápisu
Přispěvatel: PavelP 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?
Název: Re:Kontrola zápisu
Přispěvatel: rob 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.
Název: Re:Kontrola zápisu
Přispěvatel: PavelP 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
Název: Re:Kontrola zápisu
Přispěvatel: hawran diskuse 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?
Název: Re:Kontrola zápisu
Přispěvatel: rob 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.
Název: Re:Kontrola zápisu
Přispěvatel: PavelP 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...
Název: Re:Kontrola zápisu v Bashu
Přispěvatel: PavelP 12. 09. 2013, 20:26:52
Vážně nikdo neví?
Název: Re:Kontrola zápisu v Bashu
Přispěvatel: nevi 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.
Název: Re:Kontrola zápisu v Bashu
Přispěvatel: hawran diskuse 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.root.cz/knihy/bash-ocima-bohdana-milara/)
http://www.tldp.org/guides.html#abs (http://www.tldp.org/guides.html#abs)
Název: Re:Kontrola zápisu v Bashi
Přispěvatel: cyberbobak 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!"