Команде vimgrep
требуется аргумент файла на основе справки:
:vim[grep][!] {pattern} {file}...
Search for {pattern} in the files {file}... and set
the error list to the matches. Files matching
'wildignore' are ignored; files in 'suffixes' are
searched last.
Когда вы пытаетесь использовать его, как в вашем printf... | vim -
примере, ошибка даже указывает столько же:
E499: Empty file name for '%' or '#', only works with ":p:h"
%
— это сокращенное обозначение любого файла, который вы открыли в vim
. Учитывая, что при передаче через STDIN нет файла, вы не можете делать то, что хотите.
При поиске через vim
в основном есть 3 метода:
vimgrep
предназначен для поиска файлов изнутри vim
. Вы используете :grep
для вызова системной версии grep
для поиска файлов либо локально, либо в каталоге, из которого вы вызвали vim
. / предназначены для поиска в текущем буфере, в котором вы активно находитесь в vim
.
Этот третий вариант подходит для вашего сценария, когда вы выполняете поиск в буфере, который был заполнен содержимым через STDIN.
В качестве альтернативы вы можете заставить оболочку создать временный дескриптор файла, создав временный дескриптор и отправив содержимое через STDIN из этого временного дескриптора файла:
$ vim <(...)
Вы можете видеть это вот так:
$ ls -l <(echo hi)
lr-x------ 1 root root 64 Aug 2 22:15 /dev/fd/63 -> pipe:[738943]
Таким образом, вы можете обмануть vim
, заставив поверить, что содержимое поступает из файла, используя описанную выше подоболочку <(..)
вместо того, чтобы отправлять данные через STDIN:
$ vim <(...cmds...)
Процесс в фоновом режиме(some-daemon
в вашем случае )продолжает выполняться, но его идентификатор родительского процесса (PPID )изменяется на init
, процесс с PID 1. Вы можете kill
это, отправив ему сигнал, поскольку вы можете найти его PID через ps
.