Теперь, когда 2019 год подходит к концу, я решил поделиться некоторыми инструментами/советами оболочки, которые я нашел действительно полезными в 2019 году, особенно для поиска.

Искатель серебра

Silver Searcher — очень полезный инструмент для поиска содержимого файлов. Многие люди предпочитают использовать свою IDE для поиска баз кода, и этого может быть достаточно для большинства случаев использования. Однако иногда это не так, особенно если у вас есть опыт работы с bash и, например, вы хотите ограничить область поиска, чтобы найти только более узкий набор файлов, что не всегда легко с IDE, или если вы хотите отфильтровать результат, используя, например, grep.

Столкнувшись с этим, многие разработчики используют обычные инструменты bash, такие как find, grep, awk и им подобные. Например, вы можете выполнить следующую команду:

grep -rnw '/path/to/somewhere/' -e 'pattern'

Но я уверен, что, как и я, многие из вас изо всех сил пытаются запомнить аргументы и заканчивают тем, что гуглят команду почти каждый раз, когда хотят ее использовать. Альтернативное решение — использовать мощный серебряный поисковик. Внутри определенного каталога вы просто выполняете следующую команду для поиска шаблона во всех файлах в иерархии этого каталога:

ag <pattern>

Как это просто! Команда состоит всего из двух букв (это химический символ серебра, если вам интересно), что делает ее очень легкой для запоминания. Вы можете возразить, что вы можете просто создать alias для команды на основе grep выше, чтобы сделать то же самое, но серебряный искатель имеет несколько преимуществ:

  1. Это чрезвычайно быстро, что очень удобно, когда у вас огромный репозиторий.

2. Он поставляется с несколькими вариантами. Например, чтобы ограничить область поиска файлами Java, вы просто добавляете параметры --java:

ag --java <pattern>

3. Он автоматически игнорирует шаблоны файлов из ваших .gitignore и .hgignore.

4. Если в исходном репозитории есть файлы, которые вы не хотите искать, просто добавьте их шаблоны в файл .ignore. ( кашель **.min.js кашель)' (цитата из серебряного поисковика «GitHub page)

Идите вперед и установите его, и я надеюсь, вам понравится.

Обратите внимание, что искатель серебра не единственный в своем роде. Есть множество других подобных инструментов. В частности, интерес представляет ripgrep. Он написан на языке программирования Rust, и некоторые бенчмарки показывают, что он даже быстрее, чем серебряный поисковик.

Нечеткий поиск (fzf)

Fuzzy Finder — замечательный инструмент для выполнения нечетких поисков. Если в прошлом вы изо всех сил пытались найти что-то в своей кодовой базе только потому, что забыли, как именно это было написано, проверьте fzf.

Основная идея fzf чрезвычайно проста; он позволяет выполнять нечеткий поиск в списке строк. Однако есть две интересные особенности. Во-первых, это может быть любой список: файлы в иерархии папок, история команд (вспомните последний раз, когда вы пытались найти команду в Bash, используя Ctrl-R, даже если вы почти уверены, что она есть в вашей истории команд), процессы, строки, составляющие содержимое набора файлов, т. е. поиск в содержимом файлов и т. д. Другая интересная особенность — нечеткость, т. е. все, что вам нужно запомнить, — это несколько символов, обозначающих то, что вы хотите найти. Например, набрав «openamazon», я смог получить эту команду из своей истории (ниже вы увидите, как использовать fzf для поиска истории команд):

openssl s_client -connect amazon.com 2>/dev/null | openssl x509 -noout -text | grep "DNS"

Видите ли, мне не нужно было беспокоиться о пробелах или написании полного openssl. Кроме того, он позволяет вам использовать стрелки для перемещения по результату, в отличие от Ctrl-R по умолчанию, который показывает один результат:

Есть несколько вариантов использования того, как это может быть полезно, но есть несколько предложений, которые вы можете найти на странице fzf GitHub. Вот несколько полезных вариантов использования:

1. Вместо ограниченного поиска в истории командной строки Bash вы можете заменить Ctrl-R на использование fzf для запуска интерактивного нечеткого поиска в вашей истории командной строки (см. снимок экрана ниже). Если вы преданный пользователь bash, я обещаю, что это сэкономит вам часы. Кроме того, теперь, когда у вас есть мощный поиск по истории команд, вы также должны добавить следующие строки в свой to к your.bash_profile/.bashrc, чтобы не потерять ни одну команду, которую вы выполняли в прошлом. Если вы преданный пользователь bash, это сэкономит вам часы, я еще раз обещаю:

# Increase  history size
HISTSIZE=1000000
HISTFILESIZE=1000000

2. Вы изо всех сил пытались найти файл в своем огромном рабочем пространстве только потому, что не помните точное имя файла? Как вы уже догадались, вы можете использовать fzf для интерактивного поиска в иерархии текущей папки. Я просто нажимаю Ctrl-T, и появляется следующий интерактивный нечеткий поиск:

3. Как насчет того, когда вы изо всех сил пытались найти строку в своей кодовой базе, потому что не можете вспомнить тот конкретный уникальный набор символов, который раньше приводил вас прямо к нужной строке, и ваша IDE не может выполнять такие нечеткие поиски? Регулярные выражения могли помочь в прошлом, но fzf определенно проще. Я пишу следующую строку в bash:

grep --line-buffered --color=never -r "" * | fzf

и он начинает интерактивный сеанс для нечеткого поиска в вашей кодовой базе! Команда grep используется для передачи содержимого всех файлов в fzf. Ниже вы узнаете, как использовать поисковик серебра вместо grep .

Я не хочу приводить другие примеры. Просто установите fzf и творчески подойдите к интеграции ваших недавних утомительных задач поиска с fzf, и вы не пожалеете об установке этого инструмента. Проявив немного творчества, вы можете придумать невообразимые варианты использования.

связывать

Технически это не инструмент, а встроенная команда оболочки для привязки клавиш к определенным командам. Вернемся к нечеткому поисковику. Мы могли бы использовать следующую команду для выполнения нечеткого поиска по содержимому файлов в текущем каталоге:

ag --nobreak --nonumbers --noheading . | fzf

Эта команда выводит список всех строк всех файлов в текущей иерархии каталогов и направляет результат в fzf, что позволяет пользователю выполнить нечеткий поиск. Это может быть очень полезно (поверьте мне, это может быть намного мощнее, чем функция поиска вашей IDE), поэтому давайте просто привяжем ее к Ctrl-F:

bind -x '"\C-f": "ag --nobreak --noheading . | fzf"'

Все, что вам нужно сделать сейчас, это зайти в каталог вашего проекта и нажать Ctrl-F, чтобы быстро найти материал в вашей кодовой базе.

jq

Поскольку json становится повсеместным, маловероятно, что вы не будете иметь дело с ним в своей повседневной жизни программиста. Возможно, вы часто хотели извлечь значения определенного поля из вашего массива json и в конечном итоге использовали grep с последующей некоторой текстовой обработкой для извлечения значений. Если ваш json не отформатирован, например. ответ от вашего JSON API, который вы отлаживаете, вам нужно переформатировать JSON перед его сборкой. Было бы круто, если бы grep мог понимать json? Ну, тебе это не нужно, когда у тебя есть jq. jq позволяет извлекать поля (или несколько полей), применять фильтры и т. д. Лучше всего это объясняется на примерах, поэтому я отсылаю вас к учебнику jq. Проверьте руководство для получения дополнительной информации о том, что вы можете сделать с этим захватывающим инструментом.

fswatch/rsync

Тем из вас, кто часто использует облачные компьютеры (а таких сегодня много), вам, вероятно, часто приходится копировать файлы с локального компьютера в облако, чтобы провести некоторое тестирование. Это очень повторяется и снижает вашу производительность, особенно когда вы тратите много времени, пытаясь понять, почему ваше изменение кода не работает, только чтобы обнаружить, что вы забыли синхронизировать свой код. Альтернативным решением является использование файлового монитора, который автоматически выполнит определенную команду, если какой-либо из отслеживаемых файлов будет изменен. Одним из таких инструментов является fswatch. Вот как я его использую:

fswatch -o `pwd` | xargs -n1 -I{} ./sync.sh

Эта команда будет следить за текущим каталогом (который является моим рабочим каталогом) на предмет любых изменений файлов. Всякий раз, когда происходит изменение, он выполняет команду sync.sh, которая может быть примерно такой:

echo Syncing files with <myserver>
rsync -azP --exclude=build --exclude='**/*.swp' ./ <myserver>:/home/rafidka/Workspace/AWSPlayground/src/AWSPlayground
echo Sync complete...

Так что я мог бы внести любые изменения в исходный код моего проекта AWSPlayground, и он автоматически синхронизировался бы с моей облачной машиной. Обратите внимание на использование команды rsync, которая действительно полезна для синхронизации локальной папки с удаленной машиной (она копирует только измененные файлы, поэтому очень эффективна).

команда тайм-аута

Вы когда-нибудь сталкивались с тем, что сценарий занимал много времени, потому что команда, которую вы используете в своем сценарии, занимает очень много времени, прежде чем истечет время ожидания, но она не поддерживает опцию тайм-аута? Если да, то команда timeout определенно может пригодиться:

timeout 60 echo Hello, World

Это выполнит любую команду, следующую за командой timeout, и если она не ответит в течение 60 секунд, она прекратит ее выполнение. Очевидно, что эхо сразу вернется, но вы поняли: после него можно поставить любую шелл-команду.

команда времени

Если вы хотите измерить время выполнения определенной команды, вы можете использовать команду time, например:

time sleep 5
real 0m5.020s
user 0m0.005s
sys 0m0.012s

Он отображает реальное время, а также время пользователя и системы.

пиенв/рбенв

Пользователям Python может потребоваться установить несколько версий Python. Одна из причин — совместимость 2/3. Другая причина — тестирование чистой установки Python, чтобы убедиться, что ваш код устанавливает необходимые пакеты. Или просто вы хотите установить Python 3 или обновить свою установку Python. Для этого можно использовать pyenv. Его очень легко установить, и после этого вы просто выполняете следующую команду, чтобы установить новую версию Python (в данном случае 3.6.5):

https://gist.github.com/a5f15f0ed59bc7f893b33a4197972cca

Для энтузиастов Ruby есть аналогичный инструмент под названием rbenv.

Параллельный GNU

Если вам нужно много использовать Bash в своей повседневной работе, вы, вероятно, столкнулись в прошлом с каким-то сценарием, который был бы лучше с некоторым распараллеливанием для повышения производительности, а не ожиданием последовательного завершения команд в вашем сценарии, что значительно увеличивает время выполнения вашего скрипта. Тем не менее, распараллеливание сценария bash — это не шутка, и вы потратите часы на настройку своего сценария, чтобы убедиться, что: сценарий правильно сообщает код выхода в случае сбоя подпроцесса, сценарий не останавливается в случае сбоя подпроцесса. и т. д. Если вы не являетесь суперпользователем bash, скорее всего, вы потратите огромное количество времени, чтобы заставить это работать должным образом. Вместо этого вы можете использовать параллель GNU. Вам не нужно переписывать свой скрипт, чтобы он использовал команду parallel; вы можете просто применить его к своему сценарию, например.

pushd/popd

Вам когда-нибудь приходилось cd переходить в несколько разных каталогов, а затем хотелось вернуться к предыдущим папкам, как в стеке? Если да, вы можете использовать команды pushd и popd. Просто действуйте точно так же, как команда cd, за исключением того, что они выталкивают/извлекают из стека каталогов. Попробуйте!

Потрясающий

Последняя, ​​но определенно не менее важная и, вероятно, самая важная часть этой статьи — репозиторий GitHub awesome-shell. Этот репозиторий представляет собой просто файл README, содержащий список полезных вещей оболочки. Это часть серии репозиториев awesome GitHub, содержащей полезные материалы для различных областей ИТ, например. Языки программирования, игры, редакторы, безопасность и т. д. Если вы раньше не слышали об этом репозитории, обязательно проверьте это; скорее всего, вы найдете то, о чем хотели бы знать в начале 2019 года. Еще не поздно, вы определенно можете составить список полезных вещей, о которых нужно узнать в 2020 году, чтобы сделать вашу работу намного продуктивнее.