( bucko | 2018. 02. 24., szo – 15:56 )

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.