Рейтинг:1

Именование файла с использованием содержимого вывода терминала

флаг cn

Эта тема здесь обсуждали, как выводить содержимое терминала в файл. В частности, с этим:

команда |& tee output.txt

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

action_1_last_time_2021_06_15_21_34_56
action_2_last_time_2021_06_15_21_35_23
action_3_last_time_2021_06_15_21_43_45
...
action_320032_last_time_2021_06_15_23_59_14

Можно ли использовать содержимое последней строки для имени файла вместо out.txt в командной строке? Может какая-то переменная? Здесь предполагается, что последняя строка определяется как строка, которая появляется непосредственно перед закрытием файла (и завершением выполнения команды).

Рейтинг:5
флаг hr

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

Единственный разумный способ сделать это — использовать временный файл, а затем переименовать его:

tmpfile=$(mktemp)
outfile=$(command | tee "$tmpfile" | tail -n 1)
mv "$tmpfile" "$outfile"

Ты можешь измениться | к |& если вы действительно хотите захватить как stdout, так и stderr, но имейте в виду, что это май приводит к названию выходного файла после сообщения об ошибке (хотя, вероятно, есть способ избежать этого, используя умный файловый дескриптор fu).

Можно реализовать альтернативное решение, используя губка команда (из пакета больше утилит), но, вероятно, использует ту же технику под капотом. На самом деле, справочная страница говорит

   Когда это возможно, губка создает или обновляет выходной файл атомарно,
   переименование временного файла на место.

Другим вариантом может быть использование оборот перевернуть строки так, чтобы вы могли сначала прочитать последнюю строку, а затем оборот снова, чтобы восстановить порядок вывода. Однако это включает буферизацию всего вывода дважды.

Ответить или комментировать

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