Как мне отредактировать текущую команду оболочки, не выполняя ее? - PullRequest
13 голосов
/ 16 января 2020

Кажется, что есть довольно много информации о том, как редактировать и выполнять команду, используя ваш редактор, используя "edit-and-execute-command (C -x C -e)", но что бы я Как достичь - взять текущую команду оболочки, применить определенную фильтрацию (используя сценарий) и затем вернуть ее, чтобы запросить дальнейшие утверждения / изменения вручную перед выполнением. Это возможно с bash?

Ответы [ 7 ]

7 голосов
/ 20 января 2020

Последнее обновление моего опыта

Часть 0"+y$dd в следующем отображении - это действительно то, о чем вы должны тщательно подумать и адаптировать ее на свой вкус / рабочий процесс / опыт.

Для Например, очень часто я оказывался в буфере с несколькими строками, где я хотел выполнить только ту, на которой находится курсор; в этом случае я могу использовать 0"+y$dd:%d<CR> вместо 0"+y$dd.

И это только один из возможных сценариев ios.

Окончательный ответ для тех, кому нравится vim

Оригинальный ответ

Мне часто нужно делать то же самое, и я делаю это следующим образом. (Я обычно использую set -o vi в bash, поэтому пункты 1 и 2 ниже отличаются, если вы используете set -o emacs, значение по умолчанию; в зависимости от вашего вопроса, похоже, что пункты 1 и 2 объединены в Ctrl + x , за которым следует Ctrl + e , который сложнее набрать, imho.)

  1. hit Escape для перехода в обычный режим,
  2. нажмите v , чтобы войти в редактор для редактирования команды,
  3. отредактируйте команду, как мне нравится,

(Здесь вы задаете вопрос.)

Hit Escape 0 " + y $ d d : w q ,
  • Примечание: 0 " + y $ , а не просто " + y y , так как последний также скопировал бы новую строку, и это привело бы к выполнению команды после ее вставки в командную строку,
вставьте буфер в команду line
  • как это сделать, я думаю, зависит от используемого вами терминала; я нажал Ctrl + Alt + v in URxvt.
перейти к утверждению / ручному редактированию.

Очевидно, что это всего лишь обходной путь, заключающийся в копировании отредактированной команды в буфер обмена перед удалением всего команда, чтобы ничего не выполнялось при выходе из редактора, однако это лучшее, что я могу получить для себя.

Обновление

Как мои EDITOR (и * 11 48 *) равно vim, когда я редактирую команду, я редактирую ее в vim.

В этом отношении я заметил, что буфер называется /tmp/bash-fc.random, где random 6-символьная альфанумери c случайная строка.

Это дает много возможностей, если вы используете vim в качестве редактора, так как вы можете определить некоторое отображение в вашем .vimrc для выполнения вся последовательность Escape 0 " + y $ d * ** 1173 тысяча сто семьдесят два * д * ** 1175 тысяча сто семьдесят четыре *: * +1177 * W * * 1 179 Q . Например, одна команда, которую вы редко используете при редактировании командной строки: Leader d ; поэтому вы можете поместить следующий map пинг в ваш .vimrc файл

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

, чтобы шаг 4 в приведенном выше рецепте стал

хит Escape Лидер d
2 голосов
/ 21 января 2020

Это невозможно сделать в Bash / readline, но это возможно в zsh с помощью команды edit-command-line:

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

Теперь нажмите Control - x Control - e , чтобы открыть редактор, отредактировать строку, выйти из редактора - вы увидите обновленную командную строку, но она не будет выполнена автоматически.

1 голос
/ 27 января 2020

В bash есть опция для изменения команды из истории без ее выполнения. Я не уверен, что возможно использовать сценарий для этого, кажется маловероятным. Хотя вы можете вносить изменения, используя модификаторы истории.

  1. Включить параметр Histverify для предотвращения выполнения измененной команды
  2. Использовать цепочку модификаторов для изменения последней команды
  3. Использовать " !!» поместить ваш результат в командную строку для окончательного редактирования

Вот как это выглядит:

$ shopt -s histverify
$ ls *.sh
script1.sh  script2.sh  script3.sh  script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh
1 голос
/ 25 января 2020

Эти фрагменты могут приблизить вас:

a) заменить нормальную привязку для новой строки (ctrl-M) bind -x '"\C-M":date"

b) извлечь текущую строку из истории, используя !#

замените дату любым сценарием, который вы хотите.

c) отредактируйте вручную

d) если необходимо, каким-либо образом t ie в !!:p, который печатает новую команду в командной строке, но не выполняет ее, что позволяет вам вручную ее редактировать.

e) с помощью ctrl-J отправьте отредактированную команду вместо новой строки

, иначе они могут не ....

1 голос
/ 21 января 2020

Я хотел бы указать вам на Композицию рамки для Bash (я не связан с ней): https://github.com/erichs/composure

Это предоставляет функции draft и revise, которые звучат так, как будто они могут помочь с тем, что вы пытаетесь сделать. Вот (длинная) цитата из файла readme проекта:

Компоновка помогает, позволяя вам быстро создавать простые функции оболочки, разбивая фильтры длинных каналов и сложные команды на читаемые и повторно используемые фрагменты.

Сначала набросайте, потом задавайте вопросы

Как только вы создали свой драгоценный камень команды, не выбрасывайте его! Используйте draft () и дайте ему хорошее имя. Это сохраняет вашу последнюю команду как функцию, которую вы можете использовать позже. Думайте об этом как черновик.

  $ cat servers.txt
  bashful: up
  doc: down

  up-arrow

  $ cat servers.txt | grep down
  doc: down

  $ draft finddown

  $ finddown | mail -s "down server(s)" admin@here.com

Пересматривайте, пересматривайте, пересматривайте!

Теперь, когда у вас есть минимальная функция оболочки, вы можете улучшить ее с помощью рефакторинга и пересмотр. Используйте команду revise () для изменения функции вашей оболочки в вашем любимом редакторе.

  • обобщение функций с входными параметрами
  • добавление или удаление функций
  • добавление вспомогательные метаданные для документации

    $ revise finddown
    finddown ()
    {
      about finds servers marked 'down' in text file
      group admin
      cat $1 | grep down
    }
    
    $ finddown servers.txt
    doc: down
    
1 голос
/ 21 января 2020

Теперь, когда я думаю об этом, возможно, вариант того, что @kenorb предложил в комментарии, - лучший обходной путь (поскольку кажется, что решения не существует), если мы хотим придерживаться bash.

Что вы можете сделать, это добавить # (символ комментария в bash) к команде, а не echo. Затем, когда вы выйдете из exitor, команда будет неэффективна, и вам нужно будет только нажать стрелка вверх (или k , если вы используете set -o vi), удалите # и подтверждение.

Обратите внимание, что эта стратегия добавляет всего несколько нажатий клавиш, поэтому она может быть довольно эффективной, в зависимости от вашего уровня набора текста.

0 голосов
/ 16 января 2020

Это не представляется возможным с помощью сочетания клавиш, по крайней мере:

$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...