Bash-owe początki

Podziel się z innymi!

    Rzadko sięgam do Bash-a i zawsze, kiedy to robię muszę sobie wszystko przypominać od początku. No dobra – nie wszystko ;). Dzisiaj przeglądałem dysk i natknąłem się na mały programik, który kiedyś napisałem tak przy okazji. Pracowałem wtedy nad pewnym spider-em w pythonie i w ramach testów musiałem często kill-ować uruchomione przez tego „pajęczaka” procesy. Natchnęło mnie to wtedy do napisania prostego skryptu „killbyname” :D. Pamiętam, że jak na tak prostą funkcjonalność zajęło mi to wtedy zdecydowanie zbyt wiele czasu 😉

    #!/bin/bash
    # killbyname: Killing processes by name.
     
    E_BADARGS=66
     
    if test -z "$1"  # No command line arg supplied?
    then
      echo "Usage: `basename $0` Process_to_kill"
      exit $E_BADARGS
    fi
     
    PROCESS_NAME="$1"
     
    echo "Do you want kill processes:"
    ps ax | grep "$PROCESS_NAME"
    read -p "Yes (y) or No (n): " CONFIRM
     
    if [ $CONFIRM = 'y' ]
    then
        ps ax | grep "$PROCESS_NAME" | awk '{print $1}' | xargs -i kill {} 2&>/dev/null
    fi
    exit $?

    W ramach ćwiczeń popełniłem też skrypt usuwający katalogi svn-a z projektu. Aż wstyd się przyznać ale pisząc to nie wiedziałem jeszcze, że istnieje coś takiego jak ***svn export***.

    #!/bin/bash
    # rmsvn
    current_path=`pwd`
    echo "Czy na pewno chcesz z katalogu $current_path \
     usunąć wszystkie podkatalogi .svn wraz z zawartością?"
    echo "Potwierdź [y] lub anuluj [n]"
    read confirmation
    if [ $confirmation = 'y' ]
    then
        find $current_path -name "\.svn" | xargs rm -rf
    	if [ $? = 0 ]
    	then
    	    echo "Polecenie zostało wykonane."
        else
    	    echo "Wykonanie polecenia się nie powiodło!"
    	fi
    else
        echo "Polecenie zostało anulowane."
    fi

    Jak już jesteśmy przy svn-ie to najczęściej okazuje się, że na serwerze produkcyjnym nie ma możliwości skorzystania z niego. Do tego jeszcze zdarzają się klienci kombinatorzy próbujący samodzielnie dokonywać zmian w projekcie. Aktualizacja plików w takiej sytuacji sprowadza się do ręcznego porównania katalogów z wersją live i dev. Kdiff ułatwia znalezienie plików różniących się od siebie, ale brakuje narzędzia ułatwiającego wyodrębnienie wyżej wspomnianych z całego projektu. Z tego właśnie powodu podjąłem się zadania napisania skryptu porównującego dwie wersje projektu i kopiujące do katalogu update tylko te pliki z nowej wersji, które różnią się od odpowiadających im plików starej wersji. Struktura katalogów zostaje zachowana. Programik jest bardzo prosty i bynajmniej nie niezawodny, ale przydał się kilka razy.

    #!/bin/bash
    # makeupdate
     
    if [ $# -lt 2 || $1 = $2 ]
    then
        echo "Usage: `basename $0` dir_with_old_version dir_with_new_vesion"
        exit
    fi
     
    OLD_DIR="$1"
    NEW_DIR="$2"
     
    UPDATE_DIR="./update"
    mkdir $UPDATE_DIR
     
    FILES_LIST=`diff -rqPx '.*' $OLD_DIR $NEW_DIR | awk '{print $4}'`
    for FILE_PATH in $FILES_LIST
    do
       DIR_PTH=`echo $FILE_PATH | sed -r 's/\/[a-Z0-9_]{1,}\.[a-z0-9]*//g'`
       mkdir -p $UPDATE_DIR/$DIR_PTH
       cp $FILE_PATH $UPDATE_DIR/$DIR_PTH
    done
     
    exit $?
    Podziel się z innymi!

      Posted in Bash by Zbigniew Heintze · Tag: