Пару месяцев назад я написал о куче ярлыков истории командной строки , которым меня научил Фил , и после недавней встречи с шпаргалкой по истории bash от Peteris Krumins, я подумал, что было бы интересно найти некоторые реальные способы их использования.
Несколько недель назад я написал о метке порядка байтов UTF-8 (BOM), которую я хотел удалить из файла, над которым я работал, и сегодня вечером я понял, что есть другие файлы с той же проблемой.
Начальная команда читается так:
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' data/Taxonomy/Products.csv > data/Taxonomy/Products.csv.bak
Версия файла без спецификации — data / Taxonomy / Products.csv.bak, но я хотел, чтобы это был data / Taxonomy / Products.csv, поэтому мне нужно было перенести его в это место.
Используя расширение истории, мы можем написать это следующим образом:
mv !$ !!:2
! $ представляет последний аргумент, который является data / Taxonomy / Products.csv.bak, а !!: 2 получает второй аргумент, переданный последней команде, которая в данном случае является data / Taxonomy / Products.csv .
По мере того, как вы печатаете, оно расширится до следующего:
mv data/Taxonomy/Products.csv.bak data/Taxonomy/Products.csv
Одна из вещей, которые мы делаем довольно часто, это просмотр конфигураций nginx и журналов наших различных приложений, которые включали в себя следующее:
$ tail -f /var/log/nginx/site-1-access.log $ tail -f /var/log/nginx/site-2-access.log
или же
$ vi /etc/nginx/sites-enabled/site-1-really-long-name-cause-we-can $ vi /etc/nginx/sites-enabled/site-2-really-long-name-cause-we-can
Все, кроме имени файла, одинаково, но набрав стрелку вверх, чтобы получить предыдущую команду, а затем вручную удалив имя файла, может потребоваться больше времени, чем повторная запись всей команды, если имя сайта длинное.
Ctrl-w удаляет весь путь, так что это нам тоже не поможет.
Альтернативой является использование модификатора ‘h’, который «удаляет завершающий компонент имени пути, оставляя заголовок».
В этом случае мы могли бы сделать следующее:
$ vi /etc/nginx/sites-enabled/site-1-really-long-name-cause-we-can $ vi !$:h/site-2-really-long-name-cause-we-can
Нам все еще нужно набрать полное имя файла, и мы не получаем никакой помощи по автозаполнению, которая немного раздражает.
Я понял, что на моем zsh, если я наберу пробел после команды расширения истории, он расширяет то, что я набрал, до полных путей всего, что связано со следующей привязкой ключа:
.oh-my-zsh $ grep -rn "magic-space" * lib/key-bindings.zsh:20:bindkey ' ' magic-space # also do history expansion on space
Мы можем сделать то же самое в bash, выполнив следующую команду:
bind Space:magic-space
Тогда, если бы я хотел открыть этот второй файл nginx, я мог бы сделать следующее:
$ vi !$:h # then type a space which will expand it to: $ vi /etc/nginx/sites-enabled/ # I can then type backspace, then type 'site-2' and tab and open the file
Это не совсем гладко из-за возврата, но я думаю, что это немного быстрее, чем другие варианты.
Другой, о котором я упоминал в первом посте, это замена ^ оригинала ^, которая запустит предыдущую команду, но заменит первый экземпляр «оригинала» на «замена».
С этим часто кажется, что быстрее набрать стрелку вверх и изменить то, что вы хотите, вручную или повторно ввести команду, но при выполнении grep для определенной папки я думаю, что это быстрее.
например
$ grep -rn "magic-space" ~/.oh-my-zsh/lib /Users/mneedham/.oh-my-zsh/lib/key-bindings.zsh:20:bindkey ' ' magic-space # also do history expansion on space
Допустим, я был заинтригован о bindkey и хотел найти все примеры этого.
Один из способов сделать это состоит в том, чтобы набрать, а затем вручную вернуться вдоль линии, используя Meta-B, пока я не доберусь до «bind-key», когда я могу удалить это несколькими Ctrl-W , но в этом случае поиск / заменить подход быстрее:
$ ^magic-space^bindkey grep -rn "bindkey" ~/.oh-my-zsh/lib /Users/mneedham/.oh-my-zsh/lib/completion.zsh:24:bindkey -M menuselect '^o' accept-and-infer-next-history /Users/mneedham/.oh-my-zsh/lib/completion.zsh:71: bindkey "^I" expand-or-complete-with-dots
Я все еще ищу другие способы более эффективного повторного использования истории Bash, поэтому дайте мне знать о других интересных трюках в комментариях.