Olyan parancsoknál, ahol az utolsó argumentum lehet fájl vagy könyvtár is (cp, mv, install, ln -s), ha könyvtár az utolsó argumentum, akkor tegyünk a végére / jelet. Például
ne ezt írjuk: install -m 755 foobar ${UB_INSTALLDIR}/usr/bin
hanem ezt: install -m 755 foobar ${UB_INSTALLDIR}/usr/bin/
Mire jó ez?
Egyrészt a / jel sugallja, hogy "ide bele", egyértelművé teszi a kód olvasója számára, hogy az egy könyvtár neve, és nem egy fájlé.
Másrészt amennyiben az említett könyvtár még nem létezik, az esetben a program a hibaüzenettel leállást fogja választani, nem pedig szép csöndes hibás működést (a foobar progi bemásolását az $UB_INSTALLDIR/usr könyvtárba bin néven).
Olyan parancsokra, amelyek kötelezően könyvtárnévvel foglalkoznak (cd, mkdir, rmdir) ez a tanács nem vonatkozik, bár ott sem árthat a / jel.
Kerüljük a * wildcardot, ha csak lehet. Gáz van vele, ha épp nincs egyetlen fájl sem, valamint nem illeszkedik a . kezdetű fájlokra. Ha a foobar könyvtáron belüli minden fájlt át akarunk másolni, akkor ne azt írjuk, hogy
cp -a foobar/* ide/
hanem azt, hogy
cp -a foobar/. ide/
Jó kis trükk, bejön :-)
A compile és install szkripteket kezdjük így.
-e: Hiba esetén azonnal kilép.
-u: Hibát jelez, ha nem létező változónévre hivatkozunk. Elgépelések ellen nagyon jó. Ha nem tudjuk, hogy adott változó be van-e állítva, használhatjuk a ${VALAMI:-} alakot.
-x: kiírja a képernyőre, hogy mit csinál.
Használjunk idézőjeleket minél gyakrabban a bash szkriptekben!
Ha egy parancs első nem-opció argumentuma valami változó, akkor használjuk a -- kapcsolót a további argumentum-értelmezés letiltására. Például:
cp -a -- "$mit" "$hova"
echo-val nem lehet 100%-os biztonsággal kiírni egy változó értékét, mert ha a változó értéke "-n" vagy "-e" vagy ilyesmi, azt az echo kapcsolóként értelmezi, és sajnos nem ismeri a "--" kapcsolót. Ha atombiztosan akarjuk egy változó értékét kiírni, használjuk a printf beépített shell parancsot:
printf '%s\n' "$valtozo"
bash-ben nagyon nehézkes azt tesztelni, hogy egy környezeti változó létezik-e egyáltalán. A "${valtozo+boci}" szerkezetet kell használni, ennek értéke boci lesz, ha a változó létezik (akár üres), és üres érték, ha a változó nem létezik.
Emiatt általában megelégszünk azzal, hogy azt teszteljük, adott változó rendelkezik-e nemüres értékkel. Ezt így tehetjük meg:
[ -n "$valtozo" ]
vagy
[ "$valtozo" = "" ]
vagy
[ "x$valtozo" = "x" ]
Mindegyik esetben fontos az idézőjel a $valtozo körül! A harmadik megoldásban az a szép, hogy nyilván akkor is helyesen működik, ha a változó értéke mínusz jellel kezdődik. De a másik kettő is jó. Érdemes a legelső, "-n" alakra rászokni olvashatósága miatt.
Elvileg helyes az is, hogy
[ "$valtozo" ]
de ennek kerüljük a használatát, mert egyrészt undorító ronda (bocsi, ez szubjektív vélemény volt), másrészt a "-n"-es megközelítésnél is kevésbé triviális, hogy minden esetben jól működik, harmadrészt, ez a legfontosabb érv: ezt a konstrukciót nem lehet "-o" illetve "-a" kapcsolókkal vagy- és és-kapcsolatba fűzni.
A find első argumentuma mindig / jelre végződjön (kivéve ha "."). Ez arra jó, hogy ha ez az argumentum egy szimlink egy könyvtárra, akkor belemászik a find, és nem adja fel.