Jeśli piszesz skrypty w bashu, jest duża szansa, że robisz to źle.
Nagrałem film, aby pokazać zły i dobry przykład pisania skryptów, bo te skrypty zapewne "po cichu" utrzymują świat. Mimo, że łatwo rozpocząć pisanie takich skryptów, warto jednak użyć od początku odpowiedniego podejścia, aby nas później nie zaskoczyło ich nie do końca zaplanowanego zachowanie.
d.....z z- #
- #
- #
- #
- #
- #
- 117
Komentarze (117)
najlepsze
command || { ... }
to niech pozostanie przy tej notacji i zastąpi:
if [ -e "${lock_file}" ]; then ... fi
samym testem:
[ -e "${lock_file}" ] && { ... }
ALE, należy pamiętać o tym że
if ... else ... fi
dzialac bedzie inaczej niz
&& { ... } || { ... }
dla niewtajemniczonych polecam przećwiczenie:
echo foo && { echo ok; false; } || { echo
Jeśli chcesz, żeby skrypt naprawdę był przenośny, zmień "#!/usr/bin/env bash" na "#!/usr/bin/env sh" i ściśle trzymaj się standardu POSIX. Mam świadomość, że ten kurs dotyczy basha, więc uwaga jest może trochę nie na miejscu, ale niestety, używając basha, z automatu sprawiasz, że twój skrypt nie zadziała na niektórych (prostszych) systemach. Na przykład ja często piszę skrypty na system OpenWRT, które pomagają mi zarządzać
W komentarzach ktoś tu napisał również coś o kiepskim debugowaniu, a ktoś wspomniał o nieintuicyjności.
Wszystko to bzdury.
#!/bin/bash
# debug
set -x
# test bez markera plikowego
pidof -o %PPID -x $(basename $0)
if test $? -eq 0; then exit 1; fi
# jakieś polecenie na test
sleep 100
1. Co powiesz, żeby pójść odrobinę dalej i ograniczyć liczbę komentarzy na rzecz "self-explanatory" kodu. Np. zamiast
# Sprawdzamy czy plik blokady istnieje
if [ -e "${lock_file}" ]; then
dać to:
if [ file_exists "${lock_file} ] ; then
Ten przykład jest trywialny ale linię:
for file in $( "${cmd_find[@]}" | sort -rz | tail -n +${how_many}); do
Można by spróbować
Przepisuję skrypt na Pythona. Macierze w Bash to jednak gówno.
Slice na dużej macierzy zajmuje wieki...
Niestety mazowsze.