Hátha örülsz neki, ezért egy harmadik példával fogom magyarázni. ;)
Az előző példához hozzátartozik: "Ez nem egy auditált szoftverrendszer, csak egy fél sor péda. Kéretik NEM belekötni!"
Íme, az thread indító program működése:
/var/mikrotik: touch out2
/var/mikrotik: ROSbackup.py unpack -i MikroTik180223140500.backup -d /var/mikrotik/out2
** Unpack Backup **
RouterOS Plaintext Backup
Length: 31338 bytes
Extracting backup...
Traceback (most recent call last):
File "/root/bin/ROSbackup.py", line 379, in <module>
main()
File "/root/bin/ROSbackup.py", line 372, in main
unpack(args.input, args.directory)
File "/root/bin/ROSbackup.py", line 271, in unpack
files_num = unpack_files(input_file, length, unpack_directory)
File "/root/bin/ROSbackup.py", line 145, in unpack_files
create_write_file(path + name + '.idx', idx)
File "/root/bin/ROSbackup.py", line 64, in create_write_file
os.makedirs(os.path.dirname(path), exist_ok = True)
File "/usr/local/lib/python3.6/os.py", line 220, in makedirs
mkdir(name, mode)
FileExistsError: [Errno 17] File exists: '/var/mikrotik/out2'
/var/mikrotik: rm out2
/var/mikrotik: mkdir out2
/var/mikrotik: ROSbackup.py unpack -i MikroTik180223140500.backup -d /var/mikrotik/out2
** Unpack Backup **
RouterOS Plaintext Backup
Length: 31338 bytes
Extracting backup...
Directory already exists, cannot extract!
Ennek alapjan - hibaüzenetek nélkül a lehetséges kód (szerinted):
[ -d out2 ] && exit
Ezzel csak azt tudod meg, hogy már van ilyen dir. Vagy file. Vagy valami egyéb. :-D
Az olyan kódot sem szeretem, amikor meg lehetne valamit vizsgálni, de helyette engedem hibára futni a kódot:
[ -d out2 ] || mkdir out2 || echo "Elfelejtettem megvizsgálni a -e lehetőséget."
mkdir: out2: File exists
Elfelejtettem megvizsgálni a -e lehetőséget.
Tehát a fél sor példa a hivatkozott python programmal megegyezően a dir és nem más meglétének vizsgálatához elégséges feltételeket tartalmazza, de nem tér ki az egyéb lehetőségekre. Ha a példából production code készül, akkor az oskolában tanultak szerint (asszociatív, kommutatív és disztributív tulajdonságok), no meg a kívánt működés szerint szépen megírhatod a programot. Amely tartalmazni fogja mindkét vizsgálatot ahhoz, hogy az mkdir parancsot hiba nélkül futtathasd, avagy kiírhasd pontosan a hiba okát.
Erre egy lehetséges példa:
[ -e out2 ] && [ -d out2 ] &&
{
echo "Directory already exists"
exit
}
[ -e out2 ] && [ -d out2 ] ||
{
echo FileExistsError
exit
}
mkdir out2
Ezzel sikerült előállítani az eredeti program logikáját. Bár a trehány hibavizsgálatot nem teljesen, hiszen az eredetiben az egyik hibát a python dobja, a másikat meg a programozó. ;)
És igen! Van olyan eset, amikor van létjogosultsága az igazságtábládnak. De csak az első vizsgálatnál. Ennek ellenére a fenti kódot olvashatóbnak tartom.