Что позволяет избежать перенаправления bash?

Если stdin указывает на доступный для поиска файл (, как в случае bash (, но не во всех других документах оболочки ), которые реализованы с помощью временных файлов ), вы можете получить хвост, а затем искать назад, прежде чем читать полное содержание:

операторы seek доступны в оболочках zshили ksh93или языках сценариев, таких как tcl/perl/python, но не в bash. Но вы всегда можете вызвать эти более продвинутые интерпретаторы из bash, если вам нужно использовать bash.

ksh93 -c 'tail -n1; cat <#((0))' <<...

Или

zsh -c 'zmodload zsh/system; tail -n1; sysseek 0; cat' <<...

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

Некоторые решения для сохранения в памяти уже были даны.

С временным файлом, с zsh, вы можете сделать это с помощью:

seq 10 | zsh -c '{ cat =(sed \$w/dev/fd/3); } 3>&1'

Если в Linux с bashили zshили любой оболочкой, которая использует временные файлы для здесь -документов, вы можете фактически использовать временный файл, созданный здесь -документом, для хранения вывода :

. ]
seq 10 | {
  chmod u+w /dev/fd/3 # only needed in bash5+
  cat > /dev/fd/3
  tail -n1 /dev/fd/3
  cat <&3
} 3<<EOF
EOF
0
01.06.2020, 14:07
0 ответов

Теги

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