Как передать результат по каналу поиска grep в новый vi файл

Если Вы хотите, чтобы Ваша сессия заблокировалась при всех обстоятельствах, Вам нужны полномочия пользователя root. Нет никакого пути вокруг этого. Пользовательский корень всегда может kill -9 Ваши процессы. Я удивлен, что завершение работы не заставляет гнома испустить, "сохраняют - самостоятельно" сигнал. Также я полагаю, что скрипты "Постсессии" только запущены после того, как сессия гнома завершилась и (я верю) непосредственно перед тем, как Xserver завершается, подразумевая, что это не место, где Вы хотели бы поместить предупреждение, что это, как предполагается, обнаруживается на экране (если я корректен).

То, что может работать, является приложением Gnome, которое a) воздействует, "сохраняют - самостоятельно" событие гнома И b) воздействует на SIGTERM таким же образом, он реагирует на "сейф - самостоятельно". Кроме того существует мало, можно сделать, особенно без полномочий пользователя root.

Однако можно решить некорневую проблему: Запишите сценарий PostSession, который делает то, что Вы хотите и предлагаете кому-то с полномочиями пользователя root развернуть его на всех машинах, поскольку это - разумный инструмент, который помогает пользователям много. Обычно парням с полномочиями пользователя root платят для делания/сохранения пользователей счастливыми.:-)

Какова проблема, которую Вы пытаетесь решить? Почему может Вы не выход из системы Вашей сессии, когда pendrive включается?

У Вас может быть dbus клиент, который отображается, "Не забывают отключать устройство!" когда gvfs объявляет о размонтировании Файловой системы на USB-устройстве. Но я не знаю, как хорошо, который работает или даже служит Вашим целям.

65
15.11.2016, 05:27
6 ответов

При выполнении vi или энергия с '-', поскольку аргумент заставляет его считать файл для редактирования от стандартного входа. Следовательно:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

сделает то, в чем Вы нуждаетесь.

114
27.01.2020, 19:32
  • 1
    Для любого видящего это, внимание: это ожидает из stdin. В некоторых случаях необходимо будет перенаправить от stderr кому: stdin, например: valgrind my_file.out 2>&1 | vi - –  Ciro Costa 30.09.2015, 06:08
  • 2
    Это удаляет поисковые выделения –  MD. Mohiuddin Ahmed 06.11.2016, 11:28
  • 3
    @MD.MohiuddinAhmed, как Вы ожидаете сохранять grepпоиск, окрашивающий (состоявший из непечатаемых символов) в Vim? Можно всегда просто делать поиск в Vim. –  Wildcard 15.11.2016, 08:25
  • 4
    , я думал, что мы можем пойти с плагином vim.org/scripts/script.php?script_id=302 в энергии. –  MD. Mohiuddin Ahmed 15.11.2016, 15:20

Необходимо использовать перенаправление вывода:

grep ... > newfile.txt && vi newfile.txt

Кроме того, я думаю Ваш grep может быть улучшен:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt
11
27.01.2020, 19:32

В ~/bin/r:

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

в ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Затем:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

и я имею

r- () { "$@" | r; }

в моем ~/.bashrc, так

r- ls -l
1
27.01.2020, 19:32

Существует много эффективных способов сделать то, что Вы хотите, или в vi (m) или снаружи vi (m).

Выполните свою команду, произведите (временный) файл, затем отредактируйте файл (см. Joseph R. 's ответ),

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

Выполните свою команду (в фоновом режиме), чтобы произвести временный файл и отредактировать файл, с помощью ": e!" для обновления файла, поскольку это производится (это полезно для файлов журнала и других файлов, производимых другим процессом, например, кроном?),

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

Выполненный vi (m), и выполненный дочерний процесс, чтобы создать временный файл и затем считать его,

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

Или, просто переключитесь на файл,

:e /tmp/peugeot.txt

Выполненный vi (m), и использование двойной удар"!!" чтобы иметь vi выполняет дочернюю команду, беря результаты и вставляя их в текущее местоположение (перезаписывает текущую строку, поэтому удостоверьтесь, что у Вас есть пустая строка),

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

И теперь можно записать файл (если Вы хотите к) к любому имени файла,

:w /tmp/someotherfilename.txt

И ответ Petr Uzel также хорош,

grep -e "Peu[gG]eot" carlist.txt | vi -

Который читает из stdin

0
27.01.2020, 19:32

Перенаправление вывода может также использоваться как это:

vi <(grep ...)

Даже несколько выводов команды могут быть перенаправлены, как будто они были сохранены в отдельных файлах:

vim -d <(ls) <(ls -a)
5
27.01.2020, 19:32

Помимо vim - , вы также можете использовать подстановку процесса, используя синтаксис <(command) в пример:

vim <(echo This is example.)
vim <(cat /etc/hosts)

См. также:

12
27.01.2020, 19:32

Теги

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