Zakładam, że chcesz mieć jeden plik, countfile
który zawiera tylko jeden numer reprezentujący licznik wykonania.
Możesz odczytać ten licznik do zmiennej powłoki, $counter
np. Używając jednego z następujących wierszy:
read counter < countfile
counter=$(cat countfile)
Proste dodawanie liczb całkowitych można wykonać w samym Bash przy użyciu $(( EXPRESSION ))
składni. Następnie po prostu zapisz wynik z powrotem do naszego countfile
:
echo "$(( counter + 1 ))" > countfile
Prawdopodobnie powinieneś także zabezpieczyć swój skrypt dla sprawy, countfile
która jeszcze nie istnieje i utworzyć następnie zainicjowany wartością 1.
Cała sprawa może wyglądać następująco:
#!/bin/bash
if [[ -f countfile ]] ; then
read counter < countfile
else
counter=0
fi
echo "$(( counter + 1 ))" > countfile
echo $(( $(cat countfile 2>/dev/null || echo 0) + 1 )) > countfile
$(…)
zostanie wykonany przed czymkolwiek innym (szczególnie przed>
). Ale często używam tej$(cat countfile 2>/dev/null || echo 0)
części, aby uzyskać rozsądną wartość domyślną na wypadek, gdyby plik nie istniał. Możemy dodaćsponge
:-), aby być bezpiecznym.flock
poleceniu, aby zapobiec warunkom wyścigu. Zobacz unix.stackexchange.com/a/409276Po prostu pozwól skryptowi utworzyć plik dziennika, dodaj na przykład wiersz w skrypcie na końcu:
W ten sposób możesz samodzielnie sformatować sposób prezentacji daty i godziny, ale jeśli chcesz po prostu wprowadzić pełną datę i godzinę (i
HH:MM:SS
jest to format akceptowalny dla Ciebie), możesz również po prostu użyć:Następnie możesz zrobić:
Który liczy znaki nowego wiersza i daje szacunkową liczbę wierszy w pliku dziennika. Do tego można zobaczyć w pliku dziennika, nawet gdy został on wykonany. Aby dostosować go do swoich potrzeb, możesz zmienić ścieżki i nazwy używane do rejestrowania. Właśnie zrobiłem tutaj przykład, który zapisuje plik dziennika
~
.Na przykład chcesz, aby skrypt dodał tę liczbę do linii dodanej na końcu skryptu, możesz zrobić coś takiego na początku skryptu:
I zmień wiersz na końcu skryptu na coś zawierającego nawet tę informację:
źródło
To rozwiązanie wykorzystuje to samo podejście, co odpowiedź Byte Commander, ale nie opiera się na arytmetyce powłoki ani innych Bashizmach.
Przekierowania strumienia
/dev/null
(aby ukryć komunikat o błędzie w kolejnym przekierowaniu wejściaread
polecenia, jeśli plik licznika jest oczekiwany)źródło
Inne podejście
Oddzielny plik licznika ma wady:
Więc ta odpowiedź eliminuje oddzielny plik licznika i umieszcza licznik w samym skrypcie bash!
flock
gwarancji gwarantuje, że przez krótki czas dwóch użytkowników nie będzie mogło uruchomić skryptu jednocześnie.Kod
Inne podejście przy użyciu pliku dziennika
Podobnie do odpowiedzi Videonauth napisałem tutaj odpowiedź na plik dziennika: Skrypt Bash do utrzymywania ścieżki audytu / dziennika plików, do których dostęp uzyskuje się do dziennika przy każdym użyciu uprawnień roota za pomocą
gedit
lubnautilus
.Jednak haczyk jest raczej niż używanie
gksu
skryptu, który jest nazywanygsu
i wywołujepkexec
„nowoczesny” sposób używania sudo w GUI, więc powiedziano mi.Kolejną zaletą jest nie tylko to, że za każdym razem używane są uprawnienia roota,
gedit
ale także rejestrowanie edytowanej nazwy pliku. Oto kod.~/bin/gsu
:/usr/local/bin/log-file
:Zawartość pliku dziennika
gsu-log-file-for-gedit
po kilku edycjach:źródło