В Bash есть несколько удобных операторов для повторения частей последней команды:
!^расширяется до первого аргумента предыдущей команды, например,$ echo one "two three" one two three $ echo !^ echo one one!$расширяется до последнего аргумента предыдущей команды, например,$ echo one "two three" one two three $ echo !$ echo "two three" two three!*распространяется на все аргументы предыдущей команды, например,$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Насколько я понимаю, это синтаксически !!:^, !!:$и !!:*соответственно, где !!это обозначение событие , которое расширяется к предыдущей команде, и ^, $и *словесные обозначения, см Bash Reference Manual или man bash.)
Это часто довольно удобно. Но это становится еще круче с сочетаниями клавиш:
Когда вы нажимаете Alt+ .или Alt+ _, последний аргумент предыдущей команды вставляется в текущую команду, так же, как если бы вы написали
!$в этот момент.Также можно нажать Alt+ Ctrl+, yчтобы вставить первый аргумент предыдущей команды, как если бы вы написали
!^в этот момент.
(См. Библиотеку GNU Readline или info readline.)
Я предпочитаю сочетания клавиш, а не операторы истории Bash, потому что я вижу, что вставляю, прежде чем я действительно выполню команду. Тем не менее, похоже, что нет ярлыка, который позволил бы мне вставить все слова предыдущей команды, то есть того, которое выполняет свою !*работу. По крайней мере, я не смог его найти.
Есть ли такой ярлык? Если нет, то можно ли настроить библиотеку readline, чтобы добавить ее, и как?
zsh, если вы печатаете , echo !*а затем нажмите клавишу TAB, у вас есть желаемый эффект. В общем, TAB в режиме readline расширит все возможности расширения. Очень кстати; вероятно bash будет иметь какую-то конфигурацию для того же эффекта? @ Seth, я думаю, что это readline в bash, а не эмулятор терминала - не уверен, хотя.
man bash(где-то в строке 3030)
\e.и \e_сопоставлены с функцией readline yank-last-argи \e\C-yсопоставлены с yank-nth-arg. К сожалению, кажется, что нет (единственной) команды, которая добавляет несколько предыдущих аргументов одновременно.