zwykle uzywałem #!/bin/bash czym się to różni od sh?
#!/bin/bash uruchamia za pomocą basha, #!/bin/sh za pomocą sh (który w Linuksie jest dowiązaniem do innej powłoki, najczęściej basha, ale niekoniecznie ? np. w PLD jest to bodajże ksh, w Ubuntu chyba dash, w Debianie chyba jeszcze bash, ale wielu użytkowników zmienia na dasha, który ma być wkrótce, a może już jest?, domyślny). Jest to tzw.
Shebang.
Najprościej powiedzieć, że skrypty zaczynające się od #!/bin/bash to skrypty basha, zaś od #!/bin/sh ? powłoki (tak, wiem ? bash jest powłoką, to jak z kwadratami i prostokątami).
Dla ułatwienia dorzućmy inne powłoki ? np. zsh. Skrypt zsh najpewniej (jeśli wykorzystuje konstrukcje typowe dla tej powłoki, a prawdopodobnie tak jest, bo inaczej nie ma sensu dawać takiego shebanga) może zostać wykonany tylko przez zsh. Próba wykonania go za pomocą innej powłoki zakończy się błędem.
Przykładowy skrypt zsh (właściwie funkcja z .zshrc Grmla):
Kod: Zaznacz cały
emulate -L zsh
autoload -U colors
local color=$fg_bold[blue]
integer i=0
dirs -p | while read dir; do
local num="${$(printf "%-4d " $i)/ /.}"
printf " %s $color%s$reset_color\n" $num $dir
(( i++ ))
done
integer dir=-1
read -r 'dir?Jump to directory: ' || return
(( dir == -1 )) && return
if (( dir < 0 || dir >= i )); then
echo d: no such directory stack entry: $dir
return 1
fi
cd ~$dir
Próba wykonania skryptu basha (znowu mówimy o takim, który wykorzystuje zapisy typowe dla tej powłoki) ma spore szanse sukces w przypadku zsh (zachowuje sporą zgodność), jednak nie jest to pewne, ale np. za pomocą dasha nie da się już tego zrobić.
Skrypty sh, nazywane czystą powłoką, powinny dać się wykonać za pomocą każdej powłoki.
Zerknij też tutaj:
http://minio.jogger.pl/2009/11/21/popul ... ki/#shyzmy
W ramach ciekawostki dodam, że ja się obrażam, gdy ktoś mi mówi, że piszę w bashu. ;)
Wypisanie zawartości pliku ?plik? i przypisanie do zmiennej LIMIT
Ja bym to określił raczej jako ?przypisanie do zmiennej LIMIT wyniku polecenia cat plik
Kod: Zaznacz cały
STAN=`df /punkt/montowania | grep /punkt/montowania | awk '{print $4}'`
df ? wypisywanie wolnej przestrzeni zamontowanych systemów plików
grep ? wypisywanie linii pasujących do wzorca
Używam awk aby wyświetlić tylko 4 kolumnę
| - skierowanie standardowego wyjścia do potoku, który obsłuży program trzeci
Nie bardzo rozumiem na jakiej zasadzie to działa choć wiem co robi.
Bardzo proszę o wytłumaczenie łopatologiczne.
Po kolei:
df /punkt/montowania ? wypisuje dane o zajętości systemu plików
tylko dla /punkt/montowania (po co ?męczyć? komputer o inne, skoro nas nie interesują?)
grep /punkt/montowania ? wyciąga tylko linię z /punkt/montowania (nie chcemy linii ?System plików...?)
awk '{print $4}' ? wyciągamy tylko czwartą kolumnę
| (potok) ? łączy ze sobą poszczególne polecenia (wyjście pierszego jest przekazywane na wejście kolejnego). patrz:
http://programowanie-linux.wikidot.com/ ... ash:potoki
Nawiasem mówiąc popełniłem tu błąd :) ? grep jest zbędny:
Kod: Zaznacz cały
df /punkt/montowania | awk '/\/punkt\/montowania/ {print $4}'
(ukośnik uczynił zapis nieczytelnym... konstrukcja wygląda następująco: awk '/wyrażenie/ {reszta...}')
sprawdzam czy stan jest mniejsze niż limit. Jeśli tak to?
Tak.
Kod: Zaznacz cały
echo "Rany, rety, ratunku! Miejsca jest tylko:" >/tmp/mail_o_zajetym_dysku
wyświetlam ?Rany, rety, ratunku! Miejsca jest tylko:"? i zawartość pliku ?mail o zajętym dysku?
Nie. Zapisujesz ?Rany, rety, ratunku! Miejsca jest tylko:? do podanego pliku
po co sie dodaje /tmp/ ?
czy jest to potrzebne jeśli pliki będą w tym samym katalogu co skrypt?
Chodzi o pewną higienę. Pliki tymczasowe powinno się zapisywać w przeznaczonym do tego miejscu.
Po pierwsze nie robisz bałaganu jeśli z jakiegoś powodu plik tymczasowy nie zostanie usunięty. Po drugie nie trudno sobie wyobrazić, że nie będziesz miał w aktualnym katalogu prawa do zapisu.
df -h Pokazuje wolne miejsce na podłączonych systemach plików. I DOPISUJE je w pliku ?mail_o_zajetym_dysku?
Tak.
Kod: Zaznacz cały
mail -s "adminie kochany, miejsca nie mam" -f /tmp/mail_o_zajetym_dysku adres@example.com
Wysyłam maila na adres
adres@example.com
-f sprawdzenie czy plik istnieje i jest plikiem zwykłym Co znaczy że plik jest zwykły? Nie zip nie exe tak?
W mailu jest zawartość pliku mail_o_zajetym_dysku
a "adminie kochany, miejsca nie mam" jest tematem wiadomości
Tak, nie, tak.
Tak, robi to co piszesz.
Nie, plik zwykły to... no zwykły plik, czyli nie plik blokowy ani znakowy, ani katalog, ani łącze nazwane, ani link symboliczny, ani gniazdo.
Tak, wiadomość ma taką postać jak piszesz.
usuń plik (mail_o_zajetym_dysku)
?f nie proś o potwierdzenie wykonania rm
Tak. Zawsze po sobie sprzątaj (nawet w /tmp/).
Dokładnie.