Bash
Замены истории Баша
Поиск…
Использование! $
Вы можете использовать !$
Для уменьшения повторения при использовании командной строки:
$ echo ping
ping
$ echo !$
ping
Вы также можете опираться на повторение
$ echo !$ pong
ping pong
$ echo !$, a great game
pong, a great game
Обратите внимание, что в последнем примере мы не получили ping pong, a great game
потому что последний аргумент, переданный предыдущей команде, был pong
, мы можем избежать такой проблемы, добавив цитаты. Продолжая пример, наш последний аргумент был game
:
$ echo "it is !$ time"
it is game time
$ echo "hooray, !$!"
hooray, it is game time!
Краткий справочник
Взаимодействие с историей
# List all previous commands
history
# Clear the history, useful if you entered a password by accident
history -c
Обозначения событий
# Expands to line n of bash history
!n
# Expands to last command
!!
# Expands to last command starting with "text"
!text
# Expands to last command containing "text"
!?text
# Expands to command n lines ago
!-n
# Expands to last command with first occurrence of "foo" replaced by "bar"
^foo^bar^
# Expands to the current command
!#
Обозначения слов
Они разделяются :
от обозначенного события, на который они ссылаются. Двоеточие можно опустить, если указатель слова не начинается с числа !^
То же самое, что и !:^
.
# Expands to the first argument of the most recent command
!^
# Expands to the last argument of the most recent command (short for !!:$)
!$
# Expands to the third argument of the most recent command
!:3
# Expands to arguments x through y (inclusive) of the last command
# x and y can be numbers or the anchor characters ^ $
!:x-y
# Expands to all words of the last command except the 0th
# Equivalent to :^-$
!*
Модификаторы
Они изменяют предыдущее событие или обозначение слова.
# Replacement in the expansion using sed syntax
# Allows flags before the s and alternate separators
:s/foo/bar/ #substitutes bar for first occurrence of foo
:gs|foo|bar| #substitutes bar for all foo
# Remove leading path from last argument ("tail")
:t
# Remove trailing path from last argument ("head")
:h
# Remove file extension from last argument
:r
Если переменная Bash HISTCONTROL
содержит либо ignorespace
либо ignoreboth
(или, в качестве альтернативы, HISTIGNORE
содержит шаблон [ ]*
), вы можете запретить хранить ваши команды в истории Bash, добавив их в пробел:
# This command won't be saved in the history
foo
# This command will be saved
bar
Поиск в истории команд по шаблону
Нажмите кнопку управления r и введите шаблон.
Например, если вы недавно исполнили man 5 crontab
, вы можете быстро найти его, начав вводить «crontab». Приглашение изменится следующим образом:
(reverse-i-search)`cr': man 5 crontab
`cr'
есть строка, которую я набрал до сих пор. Это инкрементный поиск, так как вы продолжаете вводить текст, результат поиска обновляется в соответствии с самой последней командой, содержащей шаблон.
Нажмите клавиши со стрелками влево или вправо, чтобы отредактировать согласованную команду перед запуском, или клавишу ввода для запуска команды.
По умолчанию поиск находит самую последнюю выполненную команду, соответствующую шаблону. Чтобы снова вернуться в историю, нажмите кнопку управления r снова. Вы можете нажимать его несколько раз, пока не найдете нужную команду.
Переключитесь на новый каталог с! #: N
$ mkdir backup_download_directory && cd !#:1
mkdir backup_download_directory && cd backup_download_directory
Это заменит N-й аргумент текущей команды. В примере !#:1
заменяется первым аргументом, то есть backup_download_directory.
Повторите предыдущую команду с заменой
$ mplayer Lecture_video_part1.mkv
$ ^1^2^
mplayer Lecture_video_part2.mkv
Эта команда заменит 1
на 2
в ранее выполненной команде. Он заменит только первое вхождение строки и эквивалентен !!:s/1/2/
.
Если вы хотите заменить все вхождения, вам нужно использовать !!:gs/1/2/
или !!:as/1/2/
.
Повторить предыдущую команду с помощью sudo
$ apt-get install r-base
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
$ sudo !!
sudo apt-get install r-base
[sudo] password for <user>: