Запуск подоболочки из середины текущей команды


16

Я часто нахожу себя в этом сценарии. Я нахожусь в процессе ввода команды, и мне нужно проверить что-то еще, прежде чем завершить ее.

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

$ mylongcommand -n -e <SOME KEY COMBINATION WHICH OPENS A SUBSHELL>
$ date
...
$ exit
$ mylongcommand -n -e <BACK TO WHERE I WAS>

я использую zsh


2
Почему бы просто не открыть другое окно терминала?
Бармар

@ Barmar Для меня я не использую графический интерфейс на большинстве своих систем Linux, поэтому мне придется переключать TTY. Что означает, что я должен повторно пройти аутентификацию. Варианты ниже гораздо эффективнее.
Захари Брэди

3
Вы можете использовать screenили tmuxполучить несколько виртуальных терминалов на консоли.
Бармар

Ответы:


16

Существует комбинация клавиш, EscQкоторая сохраняет буфер команд и позволяет вводить новую команду. После запуска команды буфер содержит то, что вы набрали ранее. Если вам нужно выполнить другую команду, прежде чем закончить, вы можете набрать EscQснова.

(Я не пытался открыть подоболочку после нажатия EscQ.)

Смотрите http://zsh.sourceforge.net/Intro/intro_10.html и ищите «esc-q»


Это именно то, что я хотел, большое спасибо! Я мог бы заставить его запускать вложенную оболочку вместо немедленного возврата, но для моего варианта использования возврат сразу работает отлично.
Panayiotis

19

Я обычно использую Ctrl+, Uкоторый стирает текущую строку и сохраняет ее в буфер. Оттуда я делаю то, что когда-либо было нужно до mylongcommand. Затем, когда я буду готов, я использую Ctrl+, Yчтобы вставить mylongcommandобратно в мою подсказку.

Запомните половинную команду, пока я что-то проверяю


7

Мое решение этого вопроса явно низкотехнологичное и неуклюжее, но опирается на последовательности клавиш, с которыми вы, вероятно, уже знакомы: Hit Ctrl+ A, затем #, затем ENTER.

Это приводит к вставке символа a #в начале строки, что делает его комментарием, затем выполняет его, тем самым помещая его в историю команд. Затем вы можете ввести свою вспомогательную команду, затем прокрутить историю команд до прокомментированной команды, удалить #и завершить команду по мере необходимости.


Вы должны нажать кнопку «домой» на клавиатуре, это экономит 1 нажатие клавиши и энергию, необходимую для ее фактического нажатия
Ferrybig

@Ferrybig - да, это хорошо, хотя для моей повседневной клавиатуры это MacBook Pro, у которого нет клавиши HOME . НАЧАЛО эквивалент FN + Стрелка влево , но что прокручивается до верхней части терминала.
Цифровая травма

2

Я набираю Ctrl+, Zчтобы «приостановить» вводимую команду, и набираю другую команду. После того, как я выполнил эту команду (или прервал ее с помощью Ctrl+ C), приостановленная команда возвращается для редактирования (даже с запоминанием позиции курсора). В качестве дополнительного удобства, если командная строка пуста, когда я набираю Ctrl+ Z, клавиша bgвместо этого вызывает встроенную функцию (так что double Ctrl+ Zотправляет запущенную команду непосредственно в фоновый режим).

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

(Ранее размещено на странице «Напечатайте наполовину набранную команду, пока я проверяю что-то, что в основном имеет решения для bash, где вы не можете сделать что-либо настолько удобное. Это немного более изящная версия встроенной привязки M-qкpush-line .)

Это не запускает подоболочку: команда, которую вы вводите после «приостановки» предыдущей, запускается в той же оболочке. Это позволяет вам, например, изменять текущий каталог, если после ввода команды вы поняли, что хотите запустить ее в другом каталоге. Если вы хотите запустить новый экземпляр оболочки, вы можете запустить zshиз привязки клавиш, но я не думаю, что это особенно полезно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.