Можно ли очистить временные файлы перед их использованием в оболочке?

pcregrepработы:

pcregrep -M \
   'DEBUG.*output:\n===*\n.*?\n.*?USER_ID.*?"AAA".*?(\n*?.*?\n*)*?===*' AppLog.txt 
4
13.04.2020, 00:56
2 ответа

Это проверено в csh, tcsh, sh, ksh, zsh, bash, ash, sash:

echo foo > the-file
(rm the-file; cat) < the-file | do_slow_processing

или, если хотите,:

(rm the-file; do_slow_processing) < the-file

Интересно, что это работает и для fifos:

mkfifo the-fifo
(rm the-fifo; cat) < the-fifo | do_slow_processing &
echo foo > the-fifo

Это связано с тем, что ридер блокируется до тех пор, пока что-то не будет записано.

5
19.03.2021, 02:29
generate-the-file > the-file
exec 5< the-file
rm the-file
...
do_slow_processing 0<&5

Примечания:

  • Вам нужно запустить exec без исполняемого файла, поэтому он влияет на дескрипторы самой оболочки
  • Доступно только до fd 9
  • Вы можете использовать /proc/self/fd/X, если вам нужно имя файла. Этот интерфейс не переносим между разновидностями UNIX (, он, вероятно, работает для вас, хотя ).
  • Попытка снова прочитать файл fd (, например. два вызоваcat 0<&5)завершатся ошибкой, так как вы находитесь в EOF. Вам нужно будет перемотать его или преодолеть, прочитав через/proc/self/fd/X
  • В большинстве случаев, как описано выше, вы могли бы обойтись без фактического файла, хотя и сделать простойgenerate-the-file | do_slow_processing

Обновление:

В OP упоминается, что generate-the-fileможет не выводить вывод на стандартный вывод. Для этого есть несколько идиом:

  • Укажите выходной файл -. Принято принимать имя выходного файла -для обозначения stdout. Это признано POSIX.1 -2017 :.

    Guideline 13: For utilities that use operands to represent files to be opened for either reading or writing, the '-' operand should be used to mean only standard input (or standard output when it is clear from context that an output file is being specified) or a file named -.

(для утилит, отличных от тех, где они явно определяют это, это определено в реализации -, но есть большая вероятность, что оно поддерживается вашим generate-the-fileинструментом)

Это не будет работать во всех оболочках и требует, чтобы ОС поддерживала имена файлов fd.

0
19.03.2021, 02:29

Теги

Похожие вопросы