bash перенаправить вывод в файл - не может хранить временные тексты - PullRequest
0 голосов
/ 28 мая 2019

Я ищу по этому поводу и не нашел ответа.

Так что мой вопрос не о простом перенаправлении вывода в оболочке Linux. Я хочу, чтобы это происходило в скрипте bash, который я пишу, и я хочу, чтобы вывод и ошибка всех скриптов или команд, которые я запускаю в этом скрипте, были перенаправлены в отдельные файлы.

Это то, что я сейчас использую:

STATUSFILE=x.out
LOGFILE=x.log
exec > ${STATUSFILE} 2>${LOGFILE}
echo "bla bla"
#some other commands

, который работает нормально для нормальных выходов. Но, например, в части моего сценария я установил на свой резервный сервер команду ftp put. И когда я запускаю вручную, я вижу индикатор выполнения, показывающий, сколько времени прошло и сколько времени это займет.

То, что я пытаюсь сделать, - это захватить тот тип выходных данных, который, кажется, обновляется на лету и является своего рода динамическим, и в настоящее время я получаю другие выходные данные, хранящиеся в файлах, но не такие, как динамические.

И еще один вопрос: следую ли я хорошему подходу к этому. Как я уже сказал, я хочу получить вывод, и я собираюсь использовать его другим процессом, чтобы увидеть прогресс, а затем использовать его для информирования пользователя, пытающегося запустить задачу с помощью браузера.

Так, например, в моем случае это загрузка большого файла в хранилище ftp, какой пользователь будет командовать им из браузера, и я запускаю эти скрипты, и я хочу иметь своего рода индикатор выполнения, показывающий статус пользователю. (Я знаю, как справиться с этим на стороне клиента - возможно, проверка соединения с сокетом или ajax-запрос интервала для файла или событие, запускаемое сервером)

Мой второй вопрос: как мне получить прогресс команд, которые имеют динамический вывод.

Если что-то неясно, пожалуйста, дайте мне знать, я попытаюсь это исправить.

Спасибо за вашу помощь, ребята.

1 Ответ

0 голосов
/ 29 мая 2019

Доброе утро,

Так что мой вопрос не о простом перенаправлении вывода в оболочке Linux. Я хочу, чтобы это произошло внутри скрипта bash, который я пишу

Это довольно просто. Вам просто нужно заключить ваши команды в {}.

#!/bin/bash

{

  echo "hello world!"
  ls -la 

} >> script.log

Я хочу, чтобы вывод и ошибка всех скриптов или команд, которые я запускаю в этом скрипте, были перенаправлены в отдельные файлы.

Вы можете использовать tee, если вывод того же должен идти в отдельных файлах.

#!/bin/bash

{

  echo "hello world!"
  ls -la 

} | tee foo bar baz

Если вывод разных команд должен идти в разных файлах, вы просто должны использовать разные блоки {}.

Мой второй вопрос: как мне получить прогресс команд, которые имеют динамический вывод.

Некоторые инструменты имеют тенденцию ставить индикатор выполнения в STDERR. Вы можете перенаправить STDOUT и STDERR в один и тот же файл, используя 2>&1. 2 - дескриптор для STDERR, 1 - для STDOUT, и вы в основном добавляете 2 к 1.

Таким образом, вы переписали бы первый скрипт:

#!/bin/bash

{

  echo "hello world!"
  ls -la 

} >> script.log 2>&1

Будьте осторожны с этим, хотя. Некоторые инструменты используют цвета и возврат каретки для отображения таких хороших отформатированных индикаторов выполнения. Это будет выглядеть ужасно в файле журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...