Можно ли отобразить содержимое файла и удалить этот файл в той же команде? - PullRequest
0 голосов
/ 18 марта 2020

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

... && cat output.json && rm output.json

Есть ли умный способ объединить эти две последние команды в одну команду? Моя цель - сделать полную комбинированную командную строку максимально короткой.

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Для случаев, когда

  • возможно контролировать имя временного текстового файла.
  • Если файл не используется другим кодом

Можно передать "/ dev / stdout" в качестве имени выходного файла.

Относительно переносимости: см. Стек обмена , как переносимо ... / dev / stdout

POSIX 7 говорит, что они являются расширениями. Базовые определения,

Раздел 2.1.1 Требования: Система может предоставлять нестандартные расширения. Эти функции не требуются в POSIX.1-2008 и могут включать, но не ограничиваются: [...]

• Дополнительные специальные символьные файлы со специальными свойствами (например, / dev / stdin, / dev / stdout и / dev / stderr)

Использование обязательного поддерживаемого / dev / tty приведет к принудительному выводу в «текущий» терминал, что сделает невозможным передачу вывода всей команды в другую программу (или файл журнала), или использовать программу, когда нет подключенных терминалов (cron job или другие средства автоматизации)

1 голос
/ 18 марта 2020

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

Простой, но чрезвычайно медленный метод будет выглядеть так:

while [ -s output.json ]
do
  head -1 output.json
  sed -i 1d output.json
done

Хотя этот алгоритм просто и ясно, вы должны знать, что каждый раз, когда вы удаляете первую строку с sed -i 1d, она будет копировать все содержимое файла, но первую строку во временный файл, в результате чего в общей сложности будет записано примерно 0,5 * n² строк (где n - количество строк в вашем файле).

Теоретически вы можете избежать этого, сделав что-то вроде этого:

while [ -s output.json ]
do
  line=$(head -1 output.json)
  printf -- '%s\n' "$line"
  fallocate -c -o 0 -l $((${#len}+1)) output.json
done

Но это не учитывает переменные символы новой строки (а именно символы DOS в формате DOS) и fallocate не всегда работают на xfs , среди прочих вопросов.

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

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