Любому начинающему разработчику необходимо научиться пользоваться командной строкой. При этом для выполнения в ней команд требуется оболочка. В статье речь пойдёт об оболочке 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, которые помогут ускорить работу в терминале.
Заучите эти команды, и они сослужат вам добрую службу на пути освоения программирования.
Успехов!
Комментарии (53)
FanatPHP
22.05.2022 13:55+12В целом неплохо, если не обращать внимание на то, что все эти рекомендации приводились на Хабре раз по 10 каждая.
nronnie
22.05.2022 14:08+2"Повторение - мать учения" :) Лично я добавил себе в закладки. Непонятно, правда, зачем здесь
sed
это все-таки неbash
, а отдельное приложение и про него можно было бы отдельную статью (а то и несколько) тиснуть, но это мелочи.
funca
22.05.2022 14:33+3В некоторых компаниях HR ставят плюсики резюме при наличии ссылок на публикации. Формат "10 рецептов как.." даёт возможность не напрягаясь набивать требуемый контейнт и привлекать публику. Достаточно взять столько же абзацев из рандомных статей по теме в гугле и немножко поменять слова для большей уникальности. Парочку можно добавить от себя. В образовательном смысле это мусор, т.к. не даёт системной картинки.
Но на него охотно слетаются и потом тиражируют переводчики, которые выбирают материалы чисто по рейтингам. Надо опубликовать условный man bash на YC, чтобы перевод появился на Хабре. Иначе он ни когда не попадет в выборку.
nronnie
22.05.2022 16:41+2В тухес такие компании вместе с их HR-ами. Меня всегда еще вставляет: "Пришлите ваше резюме с описанием прошлых задач и
государственных награддостижений". Вашу ж мать. Сейчас, сделаю. Потому что я бекапы всех своих джир и прочего храню с 2000 года. А а все достижения, вот, могу и без резюме сразу словами описать - делал нормально свою работу :D
A1EF
22.05.2022 13:58+1curl ifconfig.me ; echo
Тут можно обойтись и без
echo
:curl -w'\n' ifconfig.me
13werwolf13
22.05.2022 17:03+1могу накинуть ещё вариант:
echo $(curl -s 2ip.ru)
karavan_750
22.05.2022 19:28Вариантов достаточно для начала развития вкусовщины
curl -s ipinfo.io | jq -r '.ip'
curl -s ipinfo.io/ip
ConstSe
22.05.2022 19:53Кстати, curl далеко не везде есть по дефолту. Я использую
wget -qO- eth0.me
CaptainFlint
22.05.2022 20:55+2А в некоторых дистрах наоборот, wget'а нет, а curl есть. :-)
alex1478
22.05.2022 21:58+1Всякие ifconfig.me бывают и которые по http работают, можно даже через nc ip узнать.
yulchurin
22.05.2022 15:28+1Разве не проще написать uname -a для вывода информации о системе?
CaptainFlint
22.05.2022 16:53+2Там только ядро и архитектура. А название операционки — в release-файлах.
xunixx
22.05.2022 15:28+1Как ускорить работу в командной оболочке Bash?
поставить fish ;) ну или хотя бы zsh grml
Harliff
22.05.2022 19:35Первая мысль была такая-же :)
// пользователь zsh-grml
igorp1024
23.05.2022 11:29А можете поделиться опытом grml по сравнению с oh-my-zsh + p10k? OMZ+P10K субъективно дико тормозили по сравнению с обычным bash'ем (учитывая тонны скриптов, это должно было быть ни разу не субъективно). А что можете сказать о zsh-grml?
igorp1024
23.05.2022 11:30Если не трудно, тоже подЕлитесь опытом, ответив на мой комментарий? Любопытно узнать.
skozharinov
22.05.2022 15:29Может у меня терминал какой-то не такой, но Ctrl+L не очищает экран, а просто прокручивает так, чтобы prompt был наверху экрана
nronnie
22.05.2022 16:33+1Буфер эмулятора терминала он может и не чистить. Внутри консольного vim он так вообще просто экран перерисовывает. Тут важно не это, а то, что он при этом сбрасывает состояние терминала, которое может быть повреждено какой-нибудь случайно выведенной в него ESC-последовательностью.
crawlingroof
22.05.2022 15:36"Просматривайте имя дистрибутива Linux"
lsb_release -a
CaptainFlint
22.05.2022 16:55+3
Пример странный. Если у имён нет общей части, то уж проще перечислить их через пробел, чем со скобочками возиться.mkdir {images,css,src,templates,scripts}
13werwolf13
22.05.2022 17:05+1вот так вот дейстивтельно странный, однако в скрипте где содержимое фигурных скобок это переменные/список который наполняется где-то выше это имеет больший смысл. мб ТС что-то подобное имел ввиду
AlexGluck
23.05.2022 01:39А потом в середине сломается, потому что папка уже есть. Лучше делать
mkdir -p somedir/otherdir/{raz,dva,tri}
CaptainFlint
23.05.2022 03:31А потом в середине сломается, потому что папка уже есть.
Во-первых, mkdir создаст остальные каталоги. Во-вторых, независимо от того, какую проблему мы пытаемся решить, фигурные скобочки в приведённой мной цитате абсолютно ничего не решают. Формула{images,css,src,templates,scripts}
на самом деле ещё перед выполнением команды разворачиваются шеллом в обычный списокimages css src templates scripts
, и mkdir получает на вход именно этот список, и потом просто идёт по нему, создавая каталоги. Если пользователь вручную напишет точно такой же список с пробелами, с точки зрения mkdir абсолютно ничего не поменяется.Лучше делать
А это уже как раз пример, где у перечисляемых элементов есть общая часть, вынесенная за скобки.mkdir -p somedir/otherdir/{raz,dva,tri}
karavan_750
22.05.2022 20:29наберите в оболочке cat /etc/*rel*
А есть такие дистры, которые не симлинкают файл с инфой о релизе в '/etc/os-release' ?
Просто любопытно.Симпатичная альтернатива, когда требуется чуть больше информации, чем имя дистра
13werwolf13
23.05.2022 06:29+1если вам нравится неофеч то скорее всего вам зайдёт и
inxi -Fxxx
ещё больше полезной инфы и без ненужного asci арта
vodopad
22.05.2022 21:17>Используйте раскрытие скобок для создания множества файлов
Только аккуратно. Очень легко сделать ошибку. Помню, коллега хотел выпендриться и на HP-UX создал несколько лишних устройств, когда расширял диски. Удалять уже было боязнено.
ALiEN175
23.05.2022 03:14nohup firefox freecodecamp.org &
firefox https://freecodecamp.org & disown
pkill fire*
man pgrep, pkill, pwait: All the criteria have to match.
Символы подстановки не нужны.Терминал$: sleep 300 & [1] 15055 $: pkill sle [1] + terminated sleep 300 $: sleep 300 & [1] 15062 $: pkill leep [1] + terminated sleep 300 $:
Просто наберите в оболочке cat /etc/*rel* и нажмите «Ввод».
А если /etc/*release* файлов нет в составе дистрибутива?
KoCMoHaBT61
23.05.2022 06:15+1Клавиша Cmd это совсем не замена Control на маке. Cmd-R, Cmd-L, Cmd-D не будут работать в маковском терминале.
Japet
23.05.2022 09:38Закрытый IP присваивается системой, и его можно уточнить с помощью команды
ifconfig
.Или освоить новую команду
ip
, которая приходит на замену во многих дистрибутивах
OnlySlon
23.05.2022 13:00nohup со времен внедрения systemd толком не работает. Systemd по умолчанию отстреливает эти процессы спустя некоторое время.
CaptainFlint
23.05.2022 13:15Речь о произвольных nohup или запускаемых в контексте systemd? Потому что обычные задачи я стартовал через nohup, потому что им требовалось много часов на выполнение, и они успешно завершались, никто их не прибивал.
OnlySlon
24.05.2022 11:26Про nohup запускаемых из консоли. Возможно уже поправили, но на протяжении нескольких релизов ubuntu-debain эти процессы после закрытия консоли в которой задача была запущена через nohup отстреливались.
CaptainFlint
24.05.2022 12:46Очень странно. Весь смысл nohup как раз в том, чтобы запущенный процесс продолжал работать после отвала терминала. Видимо, какой-то баг (есть или был). Но я больше с redhat-centos дело имею, на них с таким не сталкивался.
Sergey1124
23.05.2022 13:37От себя добавлю: если работаете в IntelliJ IDEA, можно установить специальный плагин, оборачивающий терминал в графическую оболочку в стиле IntelliJ. Там появляется идеевский комплишен, более привычный чем комплишен комплишен Bash, возможность открывать файлы в идеевском редакторе, и ходить по файловой системе как в Total Commander.
Поскольку это просто графическая надстройка над обычным терминалом, все фичи работают даже если подключены по ssh к удалённой машине.
Writer
При поиске команд в истории через Ctrl+R полезно знать как перемещаться между совпадениями:
Повторный Ctrl+R - в одну сторону, Ctrl+S - в другую. В последнем случае часто нужно сначала добавить в .bashrc такое:
[[ $- == *i* ]] && stty -ixon