Что ж, я новичок в Linux, и у меня проблема с простым сценарием bash.
У меня есть программа, которая добавляет в файл журнала во время работы. Со временем этот файл журнала становится огромным. Я хотел бы создать сценарий запуска, который будет переименовывать и перемещать файл журнала перед каждым запуском, эффективно создавая отдельные файлы журнала для каждого запуска программы. Вот что у меня есть на данный момент:
DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program
При запуске вижу вот это:
: command not found
program
Когда я cd в каталог журналов и запускаю dir, я вижу следующее:
201111211437\r.log\r
Что происходит? Я предполагаю, что мне не хватает какой-то синтаксической проблемы, но я не могу ее понять.
ОБНОВЛЕНИЕ: благодаря приведенному ниже комментарию шелтера, я обнаружил, что проблема связана с тем, что я редактирую файл .sh в Notepad ++ в Windows, а затем отправляю через ftp на сервер, где я запускаю файл через ssh . После запуска dos2unix в файле он работает.
Новый вопрос: как я могу правильно сохранить файл, чтобы избежать необходимости выполнять это исправление каждый раз, когда я повторно отправляю файл?
\r
это carriage_return, проверьте свой сценарий bash, возможно, он включен в сценарийlogs/$DATE.log
не так, но при вводеecho logs/$DATE.log
выводится правильный путь.DATE=$(date +"%Y%m%d%H%M")
?Ответы:
Мне нравятся те несколько строк, которые вы опубликовали из своего сценария. Возможно, дело в чем-то более глубоком.
Вам нужно найти, какая строка дает вам эту ошибку. Добавьте
set -xv
в начало вашего скрипта. Это распечатает номер строки и команду, которая выполняется для STDERR . Это поможет вам определить, где именно в сценарии возникает именно эта ошибка.Кстати, у вас есть шебанг в начале вашего сценария? Когда я вижу что-то подобное, я обычно ожидаю, что это проблема с Shebang. Например, если у вас был
#! /bin/bash
наверху, но ваш интерпретатор bash находится внутри/usr/bin/bash
, вы увидите эту ошибку.РЕДАКТИРОВАТЬ
Два пути:
источник
\r
в имени файла. В\r
конце каждой строчки вашей программы есть невидимое .mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
источник
date +"%Y%m%d%H%M"
если ваш bash немного другойОднострочный метод в bash работает так.
[вывод некоторых]> $ (date "+% Y.% m.% d-% H.% M.% S"). ver
создаст файл с именем отметки времени и расширением ver. Снимок рабочего файла со списком файлов с именем файла с отметкой даты, как показано ниже, может показать, что он работает.
find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver
Конечно
cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver
или даже проще
ls > $(date "+%Y.%m.%d-%H.%M.%S").ver
источник
Я использую эту команду для простого поворота файла:
В локальной папке у меня есть
2019-09-25-output.log
источник
Что ж, это не прямой ответ на ваш вопрос, но в GNU / Linux есть инструмент, чья работа заключается в регулярной ротации файлов журналов, сохраняя старые архивы до определенного предела. Это
logrotate
источник
Вы можете писать свои скрипты в блокноте, но просто убедитесь, что вы конвертируете их с помощью этого -> $ sed -i 's / \ r $ //' yourscripthere
Я использую его все время, когда работаю в cygwin, и он работает. Надеюсь это поможет
источник