Cóż, jestem nowicjuszem w Linuksie i mam problem z prostym skryptem basha.
Mam program, który dodaje do pliku dziennika, gdy jest uruchomiony. Z biegiem czasu ten plik dziennika staje się ogromny. Chciałbym utworzyć skrypt startowy, który zmieni nazwę i przeniesie plik dziennika przed każdym uruchomieniem, skutecznie tworząc oddzielne pliki dziennika dla każdego uruchomienia programu. Oto, co mam do tej pory:
DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program
Po uruchomieniu widzę to:
: command not found
program
Kiedy przechodzę do katalogu logs i uruchamiam dir, widzę to:
201111211437\r.log\r
Co się dzieje? Zakładam, że brakuje mi jakiegoś problemu ze składnią, ale nie mogę tego rozgryźć.
AKTUALIZACJA: Dzięki komentarzowi shelltera poniżej stwierdziłem, że problem polega na tym, że edytuję plik .sh w Notepad ++ w systemie Windows, a następnie wysyłam przez ftp na serwer, gdzie uruchamiam plik przez ssh . Po uruchomieniu dos2unix na pliku działa.
Nowe pytanie: Jak przede wszystkim poprawnie zapisać plik, aby uniknąć konieczności wykonywania tej poprawki za każdym razem, gdy ponownie wysyłam plik?
\r
jestlogs/$DATE.log
jest nie tak, ale wpisanie powodujeecho logs/$DATE.log
wyświetlenie poprawnej ścieżki.DATE=$(date +"%Y%m%d%H%M")
?Odpowiedzi:
Kilka wierszy, które opublikowałeś ze swojego skryptu, wygląda dla mnie w porządku. To prawdopodobnie coś głębszego.
Musisz dowiedzieć się, która linia powoduje ten błąd. Dodaj
set -xv
na początku swojego skryptu. Spowoduje to wydrukowanie numeru linii i polecenia, które jest wykonywane w STDERR . Pomoże ci to zidentyfikować, gdzie w skrypcie pojawia się ten konkretny błąd.A tak przy okazji, czy masz shebang na początku swojego scenariusza? Kiedy widzę coś takiego, zwykle spodziewam się, że to problem z Shebangiem. Na przykład, jeśli masz
#! /bin/bash
na górze, ale twój interpreter bash znajduje się w/usr/bin/bash
, zobaczysz ten błąd.EDYTOWAĆ
Dwie drogi:
źródło
\r
w nazwie pliku widzisz znak) . Na\r
końcu każdego wiersza w twoim programie znajduje się niewidocznymv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
źródło
date +"%Y%m%d%H%M"
jeśli twoje bash jest trochę inneMetoda pojedynczej linii w bashu działa w ten sposób.
[jakieś wyjście]> $ (data "+% Y.% m.% d-% H.% M.% S"). wer
utworzy plik z nazwą znacznika czasu z rozszerzeniem ver. Plik roboczy zawierający migawki z nazwą pliku z datownikiem w następujący sposób może pokazać, że działa.
find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver
Oczywiście
cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver
lub nawet prostsze
ls > $(date "+%Y.%m.%d-%H.%M.%S").ver
źródło
Używam tego polecenia do prostego obracania pliku:
W folderze lokalnym mam
2019-09-25-output.log
źródło
Cóż, nie jest to bezpośrednia odpowiedź na twoje pytanie, ale w systemie GNU / Linux jest narzędzie, którego zadaniem jest regularna rotacja plików dziennika, utrzymywanie starych spakowanych do pewnego limitu. Jego
logrotate
źródło
Możesz pisać swoje skrypty w notatniku, ale upewnij się, że przekonwertujesz je za pomocą tego -> $ sed -i 's / \ r $ //' yourscripthere
Używam go cały czas, kiedy pracuję w Cygwin i to działa. Mam nadzieję że to pomoże
źródło