Если 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