Любому начинающему разработчику необходимо научиться пользоваться командной строкой. При этом для выполнения в ней команд требуется оболочка. В статье речь пойдёт об оболочке Bash, которая популярна в UNIX-подобных системах и в большинстве дистрибутивов Linux используется штатно.
Впрочем, с помощью WSL (Windows Subsystem for Linux) Bash можно использовать и в Windows.
Когда же основной набор команд освоен, перед нами встаёт вопрос о повышении скорости работы.
Данное руководство предназначено не для совсем уж новичков, но я надеюсь, что полезным его найдут как опытные пользователи, так и начинающие.
Ниже приводятся 10 команд Bash, которые помогут вам ускорить работу в терминале.
1. Используйте Control + L для очистки экрана и Control + D для выхода
Для очистки экрана терминала мы вводим в командной строке
clear
. Для выхода вводим
exit
.
Удобнее же очищать экран нажатием
Ctrl + l (
⌘ + l ), а закрывать терминал сочетанием
Ctrl + d (
⌘ + d).
2. Используйте nohup для порождения процессов, не завершающихся с сеансом терминала
Загруженные в память программы называются процессами.
Иногда я запускаю Firefox из командной строки:
firefox https://freecodecamp.org
Но в таком случае при выходе из терминала браузер вылетает.
Избежать этого помогает команда
nohup
(no hang up):
nohup firefox https://freecodecamp.org
Теперь при закрытии терминала Firefox не вылетает, но вылетает моя вкладка.
Лечится это запуском Firefox в качестве фонового процесса с помощью флага
&
:
nohup firefox https://freecodecamp.org &
Теперь при выходе из терминала вкладки не страдают.
3. Используйте для завершения процессов pkill
С помощью команды
killall
можно завершать процесс по его имени:
killall firefox
Но удобнее использовать для этого
pkill
, которая позволяет вводить лишь часть имени:
pkill fire*
4. Добавляйте команду time, чтобы узнать скорость выполнения программы
Хотите узнать, как долго выполняется некая программа в оболочке?
Просто добавьте в начале команды запуска
time
:
time gcc -g *.c
5. Просматривайте имя дистрибутива Linux с помощью cat /etc/*rel*
Выполнение
uname -a
выводит информацию о системе. Хотите перепроверить, в каком дистрибутиве работаете?
Просто наберите в оболочке
cat /etc/*rel*
и нажмите «Ввод».
6. Для поиска и замены в текстовых файлах используйте sed
Нужно заменить множественные вхождения слова в текстовом файле?
Используйте команду
sed
:
sed s'/apples/oranges/g' myfile.txt
В этом случае все вхождения слова
apples
будут заменены на
oranges
.
Если нужно заменить лишь первое вхождение в каждой строке, просто уберите суффикс
g
в конце команды:
sed 's/apples/oranges/' myfile.txt
Символ
g
означает
«глобально». В качестве разделителя здесь выступает прямой слэш, хотя по факту можно использовать любой другой символ, например, нижнее подчёркивание:
sed 's_apples_oranges_g' myfile.txt
Простое использование
sed
производит замену только при выводе, оставляя исходный файл незатронутым.
Для изменения самого файла используйте флаг
-i
:
sed -i 's_apples_oranges_g' myfile.txt
7. Просматривайте публичный IP компьютера с помощью curl
Существует два типа IP-адресов: закрытые и публичные.
Закрытый IP присваивается системой, и его можно уточнить с помощью команды
ifconfig
.
Если же вы хотите узнать публичный IP вашего ПК, который провайдер присваивает вашему интерфейсу, то при подключённом интернете просто выполните в командной строке:
curl ifconfig.me ; echo
или
curl ifconfig.co ; echo
8. Используйте для обратного поиска Ctrl + R (⌘ + R)
При нажатии клавиши «вверх» отображается последняя введённая команда. При выполнении
history
выводятся все введённые команды из истории Bash.
Однако удобнее нажать
Ctrl + r (
⌘ + r) и начать набирать команду, на что оболочка начнёт предлагать автозаполнение из истории, и вам останется нажать «Ввод», когда будет найдена искомая команда.
Если запоминать из всего руководства лишь что-то одно, то запомните именно эту комбинацию: Ctrl + r (⌘ + r).
Гарантирую – она сэкономит вам уйму времени.
9. Применяйте оболочку для математических операций
Для простых вычислений, которые не получают и не выводят дроби можно использовать:
:~$ echo $((19*34))
:~$ 646
При вычислении с участием дробей просто предваряйте выражение командой
echo
и передавайте его команде
bc
:
:~$ echo "scale=2; 9*3/((2*2)+1)" | bc
:~$ 5.40
Здесь
scale
означает нужную десятичную точность.
10. Используйте раскрытие скобок для создания множества файлов
Как создать в каталоге 100 файлов?
file1.txt, file2.txt, file3.txt ... file100.txt
С помощью раскрытия скобок:
touch file{1..100}.txt
К примеру, для проекта нужно создать три файла:
app.html,
app.css и
app.js
Вместо поочерёдного их создания — можно просто сделать так:
:~$ touch app.{html,css,js}
:~$ ls
app.html app.css app.js
:~$
Если же внутри каталога проекта нужно создать, скажем, пять каталогов:
images,
css,
src,
templates и
scripts, то можно поступить так:
:~$ mkdir {images,css,src,templates,scripts}
:~$ ls
images css src templates scripts
:~$
Здесь есть лишь один нюанс: необходимо убедиться, чтобы между словами в скобках отсутствовали пробелы.
Подытожим
Я перечислил 10 рекомендаций по использованию команд в оболочке Bash, которые помогут ускорить работу в терминале.
Заучите эти команды, и они сослужат вам добрую службу на пути освоения программирования.
Успехов!
При поиске команд в истории через Ctrl+R полезно знать как перемещаться между совпадениями:
Повторный Ctrl+R - в одну сторону, Ctrl+S - в другую. В последнем случае часто нужно сначала добавить в .bashrc такое:
[[ $- == *i* ]] && stty -ixon
Правильно будет:
pkill "fire*"
Кавычки запрещают башу проводить подстановку имен файлов по шаблону fire*.
Или pkill fire\*
В целом неплохо, если не обращать внимание на то, что все эти рекомендации приводились на Хабре раз по 10 каждая.
"Повторение - мать учения" :) Лично я добавил себе в закладки. Непонятно, правда, зачем здесь
sed
это все-таки неbash
, а отдельное приложение и про него можно было бы отдельную статью (а то и несколько) тиснуть, но это мелочи.В некоторых компаниях HR ставят плюсики резюме при наличии ссылок на публикации. Формат "10 рецептов как.." даёт возможность не напрягаясь набивать требуемый контейнт и привлекать публику. Достаточно взять столько же абзацев из рандомных статей по теме в гугле и немножко поменять слова для большей уникальности. Парочку можно добавить от себя. В образовательном смысле это мусор, т.к. не даёт системной картинки.
Но на него охотно слетаются и потом тиражируют переводчики, которые выбирают материалы чисто по рейтингам. Надо опубликовать условный man bash на YC, чтобы перевод появился на Хабре. Иначе он ни когда не попадет в выборку.
В тухес такие компании вместе с их HR-ами. Меня всегда еще вставляет: "Пришлите ваше резюме с описанием прошлых задач и
государственных награддостижений". Вашу ж мать. Сейчас, сделаю. Потому что я бекапы всех своих джир и прочего храню с 2000 года. А а все достижения, вот, могу и без резюме сразу словами описать - делал нормально свою работу :Dfirefox & disown ещё можно
Тут можно обойтись и без
echo
:curl -w'\n' ifconfig.me
могу накинуть ещё вариант:
Вариантов достаточно для начала развития вкусовщины
Кстати, curl далеко не везде есть по дефолту. Я использую
wget -qO- eth0.me
А в некоторых дистрах наоборот, wget'а нет, а curl есть. :-)
Всякие ifconfig.me бывают и которые по http работают, можно даже через nc ip узнать.
А если еще проще:
Разве не проще написать uname -a для вывода информации о системе?
Там только ядро и архитектура. А название операционки — в release-файлах.
можно без cat, просто lsb_release -a
lsb_release не всегда установлен из коробки.
Нонче модно cat /etc/os-release
И он как правило есть, в отличие от lsb_release
Как ускорить работу в командной оболочке Bash?
поставить fish ;) ну или хотя бы zsh grml
Первая мысль была такая-же :)
// пользователь zsh-grml
А можете поделиться опытом grml по сравнению с oh-my-zsh + p10k? OMZ+P10K субъективно дико тормозили по сравнению с обычным bash'ем (учитывая тонны скриптов, это должно было быть ни разу не субъективно). А что можете сказать о zsh-grml?
Если не трудно, тоже подЕлитесь опытом, ответив на мой комментарий? Любопытно узнать.
или же поставить nushell, она неплохо развивается в последнее время
На bash жизнь тоже есть. https://github.com/Bash-it/bash-it
Может у меня терминал какой-то не такой, но Ctrl+L не очищает экран, а просто прокручивает так, чтобы prompt был наверху экрана
Буфер эмулятора терминала он может и не чистить. Внутри консольного vim он так вообще просто экран перерисовывает. Тут важно не это, а то, что он при этом сбрасывает состояние терминала, которое может быть повреждено какой-нибудь случайно выведенной в него ESC-последовательностью.
Для этого же используется reset
"Просматривайте имя дистрибутива Linux"
lsb_release -a
Не сработает из коробки, например, на Fedora
написал как вариант, не уточнил, много где не сработает
вот так вот дейстивтельно странный, однако в скрипте где содержимое фигурных скобок это переменные/список который наполняется где-то выше это имеет больший смысл. мб ТС что-то подобное имел ввиду
А потом в середине сломается, потому что папка уже есть. Лучше делать
mkdir -p somedir/otherdir/{raz,dva,tri}
{images,css,src,templates,scripts}
на самом деле ещё перед выполнением команды разворачиваются шеллом в обычный списокimages css src templates scripts
, и mkdir получает на вход именно этот список, и потом просто идёт по нему, создавая каталоги. Если пользователь вручную напишет точно такой же список с пробелами, с точки зрения mkdir абсолютно ничего не поменяется.А это уже как раз пример, где у перечисляемых элементов есть общая часть, вынесенная за скобки.
!$ ощутимо время экономит
>sed s'_apples_oranges_g' myfile.txt
Ух ты, не знал!
Для удобного поиска лучше fzf пока ничего не придумали.
А есть такие дистры, которые не симлинкают файл с инфой о релизе в '/etc/os-release' ?
Просто любопытно.
Симпатичная альтернатива, когда требуется чуть больше информации, чем имя дистра
если вам нравится неофеч то скорее всего вам зайдёт и
ещё больше полезной инфы и без ненужного asci арта
>Используйте раскрытие скобок для создания множества файлов
Только аккуратно. Очень легко сделать ошибку. Помню, коллега хотел выпендриться и на HP-UX создал несколько лишних устройств, когда расширял диски. Удалять уже было боязнено.
man pgrep, pkill, pwait: All the criteria have to match.
Символы подстановки не нужны.
А если /etc/*release* файлов нет в составе дистрибутива?
Клавиша Cmd это совсем не замена Control на маке. Cmd-R, Cmd-L, Cmd-D не будут работать в маковском терминале.
Или освоить новую команду
ip
, которая приходит на замену во многих дистрибутивахhttps://www.redhat.com/sysadmin/ifconfig-vs-ip
На маке тоже Ctrl-D и Ctrl-I, а не ⌘
nohup со времен внедрения systemd толком не работает. Systemd по умолчанию отстреливает эти процессы спустя некоторое время.
Речь о произвольных nohup или запускаемых в контексте systemd? Потому что обычные задачи я стартовал через nohup, потому что им требовалось много часов на выполнение, и они успешно завершались, никто их не прибивал.
Про nohup запускаемых из консоли. Возможно уже поправили, но на протяжении нескольких релизов ubuntu-debain эти процессы после закрытия консоли в которой задача была запущена через nohup отстреливались.
Очень странно. Весь смысл nohup как раз в том, чтобы запущенный процесс продолжал работать после отвала терминала. Видимо, какой-то баг (есть или был). Но я больше с redhat-centos дело имею, на них с таким не сталкивался.
От себя добавлю: если работаете в IntelliJ IDEA, можно установить специальный плагин, оборачивающий терминал в графическую оболочку в стиле IntelliJ. Там появляется идеевский комплишен, более привычный чем комплишен комплишен Bash, возможность открывать файлы в идеевском редакторе, и ходить по файловой системе как в Total Commander.
Поскольку это просто графическая надстройка над обычным терминалом, все фичи работают даже если подключены по ssh к удалённой машине.
табом можно юзать автодописывание комманд
Не везде и не всегда работает, увы. Но так-то да.