Я часто оказываюсь в следующей позиции: я начал вводить длинную команду в командной строке bash, но на полпути я обнаружил, что мне нужно проверить что-то с помощью другой команды. Это проблема, когда я на консоли (нет X), что часто бывает, потому что тогда у меня есть только следующие неудовлетворительные способы сделать это, о которых я знаю:
- Нажмите ctrl+ alt+ F2и войдите в другую виртуальную консоль, найдите то, что я хотел, затем вернитесь и продолжите
- ctrl+ a, введите echo + space+ enter, найдите то, что я хотел, нажимайте, ↑пока не найдете мою команду, ctrl+ a, delx 5, ctrl+ eи продолжайте
- Выделите то, что я до сих пор печатал, с помощью моей мыши (если gpm запущен, что обычно и происходит), нажмите ctrl+, cчтобы прервать, выясните, что я хотел, при этом стараясь не использовать мышь для выделения, затем нажмите среднюю кнопку мыши в новом окне и продолжить
- Помолитесь богам командной строки, чтобы наполовину написанная команда не имела никаких побочных эффектов, а просто потерпела неудачу, и осторожно нажмите ввод, затем найдите то, что я хотел, нажимайте стрелку вверх, пока я не верну свою команду, и продолжайте
- Запрыгивай в мою машину времени, путешествуй назад во времени и напоминай себе, чтобы начать экран, прежде чем начать вводить команду, вернуться в настоящее, нажать ctrl+ a c, узнать, что я хотел, нажать ctrl+ a ctrl+aи продолжить
Итак, я хочу знать, есть ли более элегантный способ сделать это? Этакая команда подобного типа или подобная?
Меня больше всего интересуют методы, которые не требуют какой-либо подготовки или настройки для работы.
источник
zsh
нем действительно разрезать всю линию, но наbash
нем разрезает назад. Я никогда не замечал эту разницу раньше^U
^K
будет иметь тот же эффект, что^A
^K
и немного более эргономичный, и значительно более удобный подscreen
.Выполните ctrl-A, чтобы перейти к началу строки, добавьте хеш и нажмите return - таким образом, он останется в истории команд в качестве комментария, и вы можете вернуться к нему с помощью курсора вверх.
РЕДАКТИРОВАТЬ: только что заметил, что это немного более элегантный вариант на вашем # 2;)
источник
csh
илиzsh
потому, что они не допускают комментарии в интерактивной оболочке. Вzsh
необходимо активировать правильный вариант:setopt interactive_comments
.:
для этой цели следует считать вредным и никогда, никогда не предлагать. Он будет выполнять все после точки с запятой, внутренних кавычек и т. Д. Со всеми связанными побочными эффектами.Нажмите
Ctrl+A
,Ctrl+K
чтобы перейти к началу строки и удалить (убить) до ее конца. Затем проведите исследование, и когда будете готовы продолжить, нажмитеCtrl+Y
(дергайте), чтобы вернуть сохраненную (убитую) строку назад.источник
В zsh я набираю Ctrl+, Zчтобы «приостановить» вводимую команду, и набираю другую команду. После того, как я выполнил эту команду (или прервал ее с помощью Ctrl+ C), приостановленная команда возвращается для редактирования (даже с запоминанием позиции курсора). В качестве дополнительного удобства, если командная строка пуста, когда я набираю Ctrl+ Z, клавиша
bg
вместо этого вызывает встроенную функцию (так что double Ctrl+ Zотправляет запущенную команду непосредственно в фоновый режим).Я не знаю, как сделать что-то подобное в Bash.
В любой оболочке вы можете использовать низкотехнологичный метод добавления a
#
в начале текущей строки .источник
zsh
она уже встроена ? Он называется,push-line
и все, что вам нужно сделать, это использовать,bindkey
чтобы добраться до него.push-input
а неpush-line
здесь,push-line
кажется более уместным (может быть, старые версии zsh были толькоpush-input
?). Но это не замена остальной части функции.push-line
бесполезной в пустой строке,bg
включениеCtrl+Z
полезно только в том случае, если я только что приостановил этот процесс с помощьюCtrl+Z
) и мнемоники (я либо фоновый процесс или частичная командная строка).push-input
приостанавливает весь входной буфер, тогда какpush-line
приостанавливает только текущую строку. Если я набираю многострочную команду, я хочу приостановить всю команду, такpush-input
что это правильно. Я нахожуpush-input
более полезным, чемpush-line
(если я хочу отложить строку в многострочном входном буфере, я могу просто перейти к началу строки и вставить новую строку), так что я на самом деле удивляюсь, почемуpush-line
используется связывание клавиш по умолчанию, а нетpush-input
.В bash просто введите Alt+ #.
Затем, когда вы будете готовы, нажмите Upзатем Alt+ #.
Первый помещает
#
в начало строки, чтобы превратить его в комментарий, затем принимает строку, как если бы вы нажали Enter.Затем, когда вы делаете это во второй раз, он видит, что
#
в начале строки уже есть строка , поэтому он удаляет ее и принимает ее, снова сохраняя вам Enterключ.Если второй раз просто вставляет другой
#
, вам нужно вместо этого набрать Alt+ - Alt+ #.Вы можете заставить Zsh сделать то же самое, поставив
в вашем ~ / .zshrc.
Или, если вы используете привязки vi, вы можете печатать #из командного режима как в bash, так и в zsh.
источник
Esc+1
затемAlt
+#
для переключения.Одна из моих любимых функций
zsh
- встроенная функция push-line, которая позаботится об этом без каких-либо хакерских действий в других ответах здесь. У меня это связано с Ctrl+ lв моем.zshrc
файле, как это:Затем, когда я набираю какую-то команду и мне нужно сделать что-то еще очень быстро, я могу вызвать это с помощью одной клавиши и получить пустое приглашение. После выполнения другой команды, приглашение автоматически заполняется тем, что я набирал ранее.
Вы можете даже связать несколько слоев этого, и команды будут возвращаться к вам в обратном порядке, когда вы помещаете их в очередь.
источник
Ctrl+Q
иESC q
по умолчанию (в режиме emacs).push-line-or-edit
виджет, который по умолчанию не связан ни в одной раскладке. В подсказке верхнего уровня он делает то же самоеpush-line
, но на любом уровне подсказки ниже он преобразует всю вводимую команду в многострочный буфер. Две замечательные функции на одной клавише! Я могу рекомендовать связываниеpush-line-or-edit
вместо простогоpush-line
. Вы ничего не теряете и получаете полезную функциональность.В дополнение к ctrl- a ctrl- kтрюку, если вы находитесь на экране, просто ctrl- a dотсоедините, затем присоедините
screen -r
Вы также можете просто открыть другое окно с ctrl+a c
источник
Ctrl+A c
.Альтернативный способ, хотя и не идеальный, нажмите
Ctrl-X
Ctrl-E
. Это откроет ваш редактор по умолчанию, содержащий вашу половинную команду. Затем вы можете сохранить вашу команду в файл или открыть новую оболочку из вашего редактора. Когда вы выходите из новой оболочки, она вернет вас в редактор, и сохранение содержимого автоматически выполнит их.Это не идеально, потому что оно не возвращает вас к исходной оболочке, но либо заставляет выполнить команду, либо полностью ее отбрасывает. Но нет никаких временных выборок или буферов уничтожения, о которых нужно беспокоиться, а также есть несколько приятных настроек, например, если editor = vi
источник
sudo update-alternatives --config editor
и выберите ваш любимый редактор. Для других систем установите переменные окружения EDITOR или VISUAL для вашего любимого редактора, например, добавьтеexport EDITOR=/usr/bin/nano
в ваш .bashrc.Подобно методу добавления
#
в начале строки, есть, пожалуй, более простой метод, который я использую, который не требует возврата к началу строки:Просто добавьте открытую цитату и не закрывайте ее, одинарную или двойную.
Затем нажмите Enter.
Затем нажмите CtrlC.
Частичная команда сохраняется в истории команд (доступно через стрелку вверх), но фактически не выполняется.
источник
Используя zsh, если вы наберете
<ESC> q
(escape, затем Q), строка вашего приглашения будет обрезана, чтобы вы могли ввести другую команду. Вы автоматически получите обратно вырезанный текст в следующем приглашении.Он может запоминать несколько строк одновременно, поэтому вы можете использовать его, пока линия ждет вас. Вы даже можете использовать его в пустой строке, чтобы задержать возобновление вашей линии разреза.
Это не самый эффективный способ, если вам нужно использовать несколько команд для проверки / подготовки (вам придется перепечатывать
<ESC> q
перед каждой командой). Но я думаю, что это можно привязать к более короткому ярлыку.Если вы просто хотите проверить руководство, наберите
<ESC> h
(escape, затем H). Это запуститrun-help
встроенное, с первым словом командной строки в качестве аргумента. Вы найдете обратно свою линию нетронутой, как только закончите.источник
M-q
вместо<ESC> q