Статьи

Поиск путей использования ярлыков истории командной строки bash

Пару месяцев назад я написал о куче ярлыков истории командной строки , которым меня научил Фил , и после недавней встречи с шпаргалкой по истории 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, поэтому дайте мне знать о других интересных трюках в комментариях.