Предположим, что у меня есть файл с именем, filename123.txt
и это единственный файл, который назван так, и я могу сделать locate
это с помощью команды locate filename123
. И он возвращает только этот файл.
Теперь я хочу открыть его с помощью vi
/ vim
. Но я не хочу идти в это место и вводить vi
команду с именем файла. Здесь я хочу, чтобы результат locate filename123
был добавлен к команде vi. Как я могу это сделать? Я уже попробовал:
locate filename123 | vi
Но это не работает. И эта ошибка приходит в терминал:
santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
command-line
terminal
vim
io-redirection
locate
Сантош Кумар
источник
источник
Ответы:
Вы можете использовать
xargs
:По умолчанию
xargs
будет выполнено как можно меньше экземпляров указанной команды, передавая как можно больше параметров в соответствии с ARG_MAX системы . Чтобы ограничить количество параметров, передаваемых экземпляруvi
, используйте опциюxargs
'-n
.Для обработки имен файлов, содержащих пробелы, используйте
xargs
'-d
option:Для обработки имен файлов, содержащих переводы строки, используйте параметр
xargs
'-0
option ' вместе с параметромlocate
''-0
:(Если
-0
не доступно ни на одном из них, проверьте--null
также или другой способ указать символ в\000
качестве разделителя.)источник
locate
качестве входных данных для vi. Vi, как и любая другая программа, ожидает, что имя файла (ов) будет работать в качестве аргументов.Вы можете использовать расширение команды:
Чтобы сделать
vim
чтение его стандартным вводом, вы можете сделатьvim -
, но это просто даст вам вывод,locate
которые являются путями к имени файла. Это может сработать, хотя использованиеvim
gf
обычной команды откроет путь, на котором находится курсор.редактировать
В случае имен файлов с пробелами в них лучше использовать
xargs
упомянутую опцию илиvim
решение, описанное выше. Обратите внимание, чтобы сделатьgf
работу, вам нужно добавить место дляisfname
:Этот совет и альтернативы описаны здесь .
Редактировать 2
Добавлены цитаты и
head
как предложено PeterO в комментариях .источник
another
иfile
:(.vi "$(locate filename123)"
... Чтобы убедиться, что он имеет только одно имя файла для работы:vi "$(locate filename123 |head -n1)"
Самый простой способ - передать в
locate
качестве замены оболочки , например:Вы также можете использовать
find
вместоlocate
передачи имен файлов для редактирования, например:В Unix / OSX вы можете использовать
xargs
с-o
параметром, например:Или в Linux попробуйте следующий обходной путь, используя:
Если вы используете разные команды, используйте подстановку команд для достижения этого, например:
В качестве альтернативы используйте GNU
parallel
вместоxargs
принудительного распределения tty, например:Примечание:
parallel
в Unix / OSX не будет работать, так как он имеет разные параметры и не поддерживает tty.Многие другие популярные команды также предоставляют псевдо-tty распределение (например,
-t
вssh
), поэтому обратитесь за помощью.Другое предложение - использовать
vipe
(командный канал Vim) или использовать следующий простой скрипт:Связанные с:
источник