Работая в Linux или обслуживая сервера, избежать ввода команд в Bash/Sh/Zsh невозможно. Говоря Linux, в первую очередь мы подразумеваем консоль.
Ниже я опишу несколько прикольных трюков/команд, которые могут немного облегчить жизнь в консоли начинающему линуксоиду.
01 Фиксация происходящего в консоли
Бывает, что активно работаешь, разворачиваешь что-то в первый раз или просто строишь сложную инфраструктуру, потом отвлекся (на совещание/обед/тушение пожара), а когда вернулся к работе забыл часть того, что делал.
Сам Bash умеет логировать вводимые команды и их всегда можно увидеть в файле:
~/.bash_history
(лог вводимых команд для каждого пользователя лежит в его домашней директории)
Но что делать, если нужно еще и знать, что выводилось в ответ на ту или иную команду? Для этого есть команда "script".
Синтаксис:
script [options] [file]
Пишите:
scipt terminallog.scr
для сохранения всего, что будет дальше выполняться в этом окно теринала.
Для остановки логирование выполните команду:
exit
Для продолжения записи в этот же файл:
scipt -a terminallog.scr
Если хотите почитать то, что записалось:
cat terminallog.scr
на экран будет выведено всё, что происходило
02 Алиасы команд
Если во время обслуживания приходится постоянно вводить одни и те же длинные команды, то можно использовать алиасы (alias).
Например, мы хотим сократить команду "docker":
alias d=docker
Теперь проверим:
d ps
Вот что получилось:
Если нужно создать алиас на команду с параметрами, например на команду "docker ps", то при создании алиаса после знака равенства напишите сокращаюмую команду в одинарных кавычках, типа так:
alias d='docker ps'
Теперь вместно "docker ps" нам достаточно набрать "d".
Чтобы созданный алиас не исчез после закрытия сессии, пропишите команду создания алиаса в файл профиля Вашего командного интерпретатора. Вот где они находятся для Bash и ZSH:
- Bash – ~/.bashrc
- ZSH – ~/.zshrc
03 Сразу несколько команд
Иногда нужно выполнить сразу несколько команд. Это делается просто: перечисляйте команды с примеyением разделителя ";" . Например:
who; pwd; ls
Если же Вам нужно, чтобы команды исполнялись последовательно, т.к. результат выполнения каждой команды может повлиять на последующую, то вместо разделителя ";" используйте разделитель "&&". Например:
apt update && apt upgrade -y
04 Поиск команд, введенных ранее
Иногда нужно набрать команду, которую уже набирали ранее, но команда длинная, есть куча параметров в которых можно напортачить, а Вы не любите портачить. Ничего страшного, нажмите на клавиатуре стрелочку "Вверх" , потом еще раз и ещё. Каждое нажатие возвращает Вас на шаг назад. Аналогично действует клавиша "Вниз" на клавиатуре, только вы двигаетесь по истории ввода команд не назад, а вперед.
А как быть с командой, которую вводили давно? Можно открыть файл ~/.bash_history и через поиск по файлу найти команду, а потом ее скопировать в буфер обмена. Далее нужно будет из буфера обмена вставить строку. Не очень удобно.
Можно иначе.
Нажмите "CTRL+R" и появится интерфейс для ввода поискового запроса. Начните набирать ту длинную команду, которую ранее набирали и поисковик подскажет ту строку. Когда вы увидите, что поисковик отобразил нужную Вам команду, то просто нажмите Enter и команда выполнится
Бывает так, что команда очень длинная и она такая не одна, есть еще с десяток таких же длинных, которые отличаются только последними параметрами. Если мы будем в поиске рыться, то, фактически, наберем эту команду сами, пока доберемся до нужной. Как быть?
Можно заранее подготовиться :) Набирая длинную команду, в конце поставьте тег, что-то типа "#getfirst". Например:
ls #getfirst
После этого вызвав поиск, ищите просто по тегу. В чём фокус? В том, что командный интерпретатор знак "#" воспринимает как комментарий и все что после этого знака идет он не выполняет, но в history эта команда сохранится вместе с этим комментарием, что и поможет нам при поиске.
05 Повторное использование параметра
Бывает, что нужно выполнить одну команду с параметром, а потом другую с ним же. Как не набирать всё руками?
Либо использовать на клавиатуре стрелочку "Вверх" для вызова предыдущей команды, чтобы потом исправить первую часть команды на новую, либо вызвать новую команду и передать ей повтор параметра с помощью "!$". Например:
cd !$
Вот как это выглядит на экране:
06 Автоответ в интерактивном скрипте
Некоторые скрипты запрашивают подтверждение каких-либо действий в интерактивном режиме, например, принятие соглашение о защите авторских прав. Обычно в таком случае требуется ввести "yes" и нажать Enter, чтобы работа скрипта продолжилась.
Пожно поступить так:
yes | script_deleteallfiles
07 Найти id процесса
Мы хотим прибить ранее запущенный процесс, но не знаем его id.
Допустим, это один из нескольких python-скриптов. Если убить процесс по имени python3, то улетят все скрипты, использующие python3. Поэтому правильнее искать по имени файла-скрипта в списке запущенных процессов:
ps ax | grep prog.py
и когда мы узнаем id нужного процесса, тогда уже его и убить
08 Переключение между задачами
Бывает, что Вы работаете на консоли, запустили какой-то скрипт, который достаточно долго работает, но тут Вам срочно нужно запустить еще что-то. Как это сделать в рамках одной сессии?
Нажмите "CTRL+Z" и запущенный скрипт уйдет в фон (foregroud), а Вам снова станет доступна консоль для работы.
На скриншоте выше видно, что консоль нам вернулась и можно вводить команды дальше. Но как потом вернуться назад?
Когда процесс уходил в фон, он сообщил нам номер, который был присвоен этой жопе джобе (Job). На картинке это:
[2]+
т.е. номер этой джобы: 2
Кроме того, номера всех джоб (Jobs) в рамках этой сессии можно получить командой (исли вдруг забудете присвоенный номер):
jobs
Чтобы вернуться к нужной джобе (в нашем случае №2), мы используем команду "fg":
fg 2
таким образом мы вернемся к экрану, где мы запускали наш скрипт.
09 Очистка всего файла
Иногда нужно просто очистить весь файл, а не удалять и заново его создавать.
Как сделать? Просто. Через оператор ">". Пример
> file.txt
Вот что получается:
10 Поиск файлов, содержащих строку
Если внутри директории нужно найти файлы, в которых содержится определенный текст, то делается это так:
grep -rl "что_мы_ищем" /home/spider/temp
где /home/spider/temp - путь к папке, внутри которой производится поиск
. . .
Linux - очень мощная и развитая система. Разнообразие способов решать различные задачи в ОС этого семейства настолько огромное, что даже книги не хватит, чтобы всё описать, но будет здорово, если кому-то пригодятся описанные выше трюки.