Правильный инструмент для этого - awk. Он позволяет вам выразить логику простым способом: установите переменную seen
при первом просмотре шаблона и пропустите строки, соответствующие шаблону, если он уже был замечен. Если строка не пропущена, распечатайте ее.
awk '/^yyyy-mm-dd[ \t]+hh:mm:ss$/ {if (seen) next; ++seen}
1 {print}'
Это можно сократить, но это становится более загадочным.
awk '!(/^yyyy-mm-dd[ \t]+hh:mm:ss$/ && !(seen++))'
Я нашел это нетривиальное решение:
#!/bin/sh
file_path=$1/script-file-name
while inotifywait -e create "$1"; test ! -f "$file_path"
do
:
done
chmod g+rw "$file_path"
chown root "$file_path"
Этот сценарий должен запускаться с привилегиями root
:
sudo <catch-script> /dir/where/the/target/will/be/generated
Ранее каталог, в котором будет создан сценарий, должен быть указан как следует:
chown root /dir/where/the/target/will/be/generated
chmod 1775 /dir/where/the/target/will/be/generated
Т.е. мы устанавливаем липкий бит для каталога, в котором будет размещен скрипт. Затем указанный (перехватывающий) сценарий ожидает, пока целевой сценарий будет создан, устанавливает для него разрешение на запись (чтобы дать возможность генерирующей программе работать с ним) и меняет владельца на корень
(чтобы запретить удаление).
Размещение временного файла в файловой системе, в которой хранятся все версии файлов, например copyfs . Пример использования:
mkdir /tmp/backend /tmp/recorded
copyfs-mount /tmp/backend /tmp/recorded
TMPDIR=/tmp/recorded myprogram
ls /tmp/backend
cat /tmp/backend/metadata.
…
fusermount -u /tmp/recorded
Вы можете временно заменить интерпретатор сценария на программу по вашему выбору (например, cat
), которая позволит вам либо просмотреть сценарий на экране, либо сохранить его где-нибудь. По определению, нет возможности скрыть сценарий от интерпретатора.
Если рассматриваемая программа не предназначена для хранения скрипта в секрете, вы, вероятно, сможете найти его на своем диске с помощью extundelete
или аналогичного инструмента для файловой системы, которую вы используете.