Любому начинающему разработчику необходимо научиться пользоваться командной строкой. При этом для выполнения в ней команд требуется оболочка. В статье речь пойдёт об оболочке 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)


  1. Writer
    22.05.2022 13:25
    +8

    При поиске команд в истории через Ctrl+R полезно знать как перемещаться между совпадениями:

    Повторный Ctrl+R - в одну сторону, Ctrl+S - в другую. В последнем случае часто нужно сначала добавить в .bashrc такое:

    [[ $- == *i* ]] && stty -ixon


  1. pae174
    22.05.2022 13:38
    +6

    pkill fire*

    Правильно будет:

    pkill "fire*"

    Кавычки запрещают башу проводить подстановку имен файлов по шаблону fire*.


    1. citius
      22.05.2022 23:58

      Или pkill fire\*


  1. FanatPHP
    22.05.2022 13:55
    +12

    В целом неплохо, если не обращать внимание на то, что все эти рекомендации приводились на Хабре раз по 10 каждая.


    1. nronnie
      22.05.2022 14:08
      +2

      "Повторение - мать учения" :) Лично я добавил себе в закладки. Непонятно, правда, зачем здесь sed это все-таки не bash , а отдельное приложение и про него можно было бы отдельную статью (а то и несколько) тиснуть, но это мелочи.


    1. funca
      22.05.2022 14:33
      +3

      В некоторых компаниях HR ставят плюсики резюме при наличии ссылок на публикации. Формат "10 рецептов как.." даёт возможность не напрягаясь набивать требуемый контейнт и привлекать публику. Достаточно взять столько же абзацев из рандомных статей по теме в гугле и немножко поменять слова для большей уникальности. Парочку можно добавить от себя. В образовательном смысле это мусор, т.к. не даёт системной картинки.

      Но на него охотно слетаются и потом тиражируют переводчики, которые выбирают материалы чисто по рейтингам. Надо опубликовать условный man bash на YC, чтобы перевод появился на Хабре. Иначе он ни когда не попадет в выборку.


      1. nronnie
        22.05.2022 16:41
        +2

        В тухес такие компании вместе с их HR-ами. Меня всегда еще вставляет: "Пришлите ваше резюме с описанием прошлых задач и государственных наград достижений". Вашу ж мать. Сейчас, сделаю. Потому что я бекапы всех своих джир и прочего храню с 2000 года. А а все достижения, вот, могу и без резюме сразу словами описать - делал нормально свою работу :D


  1. magrif
    22.05.2022 13:56

    1. firefox & disown ещё можно


  1. A1EF
    22.05.2022 13:58
    +1

    curl ifconfig.me ; echo

    Тут можно обойтись и без echo:

    curl -w'\n' ifconfig.me


    1. 13werwolf13
      22.05.2022 17:03
      +1

      могу накинуть ещё вариант:

      echo $(curl -s 2ip.ru)


      1. karavan_750
        22.05.2022 19:28

        Вариантов достаточно для начала развития вкусовщины

        curl -s ipinfo.io | jq -r '.ip'
        curl -s ipinfo.io/ip


        1. ConstSe
          22.05.2022 19:53

          Кстати, curl далеко не везде есть по дефолту. Я использую

          wget -qO- eth0.me


          1. CaptainFlint
            22.05.2022 20:55
            +2

            А в некоторых дистрах наоборот, wget'а нет, а curl есть. :-)


            1. alex1478
              22.05.2022 21:58
              +1

              Всякие ifconfig.me бывают и которые по http работают, можно даже через nc ip узнать.


      1. VenusKanami
        23.05.2022 06:05

        А если еще проще:

        curl ident.me


  1. yulchurin
    22.05.2022 15:28
    +1

    Разве не проще написать uname -a для вывода информации о системе?


    1. CaptainFlint
      22.05.2022 16:53
      +2

      Там только ядро и архитектура. А название операционки — в release-файлах.


      1. firefox85
        22.05.2022 23:44

        можно без cat, просто lsb_release -a


        1. citius
          22.05.2022 23:59

          lsb_release не всегда установлен из коробки.


        1. 4eburashk
          24.05.2022 04:23

          Нонче модно cat /etc/os-release
          И он как правило есть, в отличие от lsb_release


  1. xunixx
    22.05.2022 15:28
    +1

    Как ускорить работу в командной оболочке Bash?

    поставить fish ;) ну или хотя бы zsh grml


    1. Harliff
      22.05.2022 19:35

      Первая мысль была такая-же :)

      // пользователь zsh-grml


      1. igorp1024
        23.05.2022 11:29

        А можете поделиться опытом grml по сравнению с oh-my-zsh + p10k? OMZ+P10K субъективно дико тормозили по сравнению с обычным bash'ем (учитывая тонны скриптов, это должно было быть ни разу не субъективно). А что можете сказать о zsh-grml?


    1. igorp1024
      23.05.2022 11:30

      Если не трудно, тоже подЕлитесь опытом, ответив на мой комментарий? Любопытно узнать.


    1. MAaxim91
      23.05.2022 11:41

      или же поставить nushell, она неплохо развивается в последнее время


    1. toporov
      24.05.2022 10:43

      На bash жизнь тоже есть. https://github.com/Bash-it/bash-it


  1. skozharinov
    22.05.2022 15:29

    Может у меня терминал какой-то не такой, но Ctrl+L не очищает экран, а просто прокручивает так, чтобы prompt был наверху экрана


    1. nronnie
      22.05.2022 16:33
      +1

      Буфер эмулятора терминала он может и не чистить. Внутри консольного vim он так вообще просто экран перерисовывает. Тут важно не это, а то, что он при этом сбрасывает состояние терминала, которое может быть повреждено какой-нибудь случайно выведенной в него ESC-последовательностью.


      1. skymal4ik
        22.05.2022 17:20

        Для этого же используется reset


  1. crawlingroof
    22.05.2022 15:36

    "Просматривайте имя дистрибутива Linux"
    lsb_release -a


    1. skozharinov
      22.05.2022 15:43

      Не сработает из коробки, например, на Fedora


      1. crawlingroof
        22.05.2022 16:16

        написал как вариант, не уточнил, много где не сработает


  1. CaptainFlint
    22.05.2022 16:55
    +3

    mkdir {images,css,src,templates,scripts}
    Пример странный. Если у имён нет общей части, то уж проще перечислить их через пробел, чем со скобочками возиться.


    1. 13werwolf13
      22.05.2022 17:05
      +1

      вот так вот дейстивтельно странный, однако в скрипте где содержимое фигурных скобок это переменные/список который наполняется где-то выше это имеет больший смысл. мб ТС что-то подобное имел ввиду


    1. AlexGluck
      23.05.2022 01:39

      А потом в середине сломается, потому что папка уже есть. Лучше делать mkdir -p somedir/otherdir/{raz,dva,tri}


      1. 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}
        А это уже как раз пример, где у перечисляемых элементов есть общая часть, вынесенная за скобки.


  1. Harliff
    22.05.2022 19:26

    !$ ощутимо время экономит


  1. Harliff
    22.05.2022 19:28
    +1

    >sed s'_apples_oranges_g' myfile.txt

    Ух ты, не знал!


  1. Alghazanth
    22.05.2022 20:21
    +1

    Для удобного поиска лучше fzf пока ничего не придумали.


  1. karavan_750
    22.05.2022 20:29

    наберите в оболочке cat /etc/*rel*

    А есть такие дистры, которые не симлинкают файл с инфой о релизе в '/etc/os-release' ?
    Просто любопытно.

    Симпатичная альтернатива, когда требуется чуть больше информации, чем имя дистра


    1. 13werwolf13
      23.05.2022 06:29
      +1

      если вам нравится неофеч то скорее всего вам зайдёт и

      inxi -Fxxx

      ещё больше полезной инфы и без ненужного asci арта


  1. vodopad
    22.05.2022 21:17

    >Используйте раскрытие скобок для создания множества файлов

    Только аккуратно. Очень легко сделать ошибку. Помню, коллега хотел выпендриться и на HP-UX создал несколько лишних устройств, когда расширял диски. Удалять уже было боязнено.


  1. ALiEN175
    23.05.2022 03:14

    nohup 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* файлов нет в составе дистрибутива?


  1. KoCMoHaBT61
    23.05.2022 06:15
    +1

    Клавиша Cmd это совсем не замена Control на маке. Cmd-R, Cmd-L, Cmd-D не будут работать в маковском терминале.


  1. Japet
    23.05.2022 09:38

    Закрытый IP присваивается системой, и его можно уточнить с помощью команды ifconfig.

    Или освоить новую команду ip, которая приходит на замену во многих дистрибутивах

    https://www.redhat.com/sysadmin/ifconfig-vs-ip


  1. neznaju
    23.05.2022 10:26

    1. На маке тоже Ctrl-D и Ctrl-I, а не


  1. OnlySlon
    23.05.2022 13:00

    nohup со времен внедрения systemd толком не работает. Systemd по умолчанию отстреливает эти процессы спустя некоторое время.


    1. CaptainFlint
      23.05.2022 13:15

      Речь о произвольных nohup или запускаемых в контексте systemd? Потому что обычные задачи я стартовал через nohup, потому что им требовалось много часов на выполнение, и они успешно завершались, никто их не прибивал.


      1. OnlySlon
        24.05.2022 11:26

        Про nohup запускаемых из консоли. Возможно уже поправили, но на протяжении нескольких релизов ubuntu-debain эти процессы после закрытия консоли в которой задача была запущена через nohup отстреливались.


        1. CaptainFlint
          24.05.2022 12:46

          Очень странно. Весь смысл nohup как раз в том, чтобы запущенный процесс продолжал работать после отвала терминала. Видимо, какой-то баг (есть или был). Но я больше с redhat-centos дело имею, на них с таким не сталкивался.


  1. Sergey1124
    23.05.2022 13:37

    От себя добавлю: если работаете в IntelliJ IDEA, можно установить специальный плагин, оборачивающий терминал в графическую оболочку в стиле IntelliJ. Там появляется идеевский комплишен, более привычный чем комплишен комплишен Bash, возможность открывать файлы в идеевском редакторе, и ходить по файловой системе как в Total Commander.

    Поскольку это просто графическая надстройка над обычным терминалом, все фичи работают даже если подключены по ssh к удалённой машине.


  1. klounader
    23.05.2022 14:15

    табом можно юзать автодописывание комманд


    1. dlinyj
      23.05.2022 17:02

      Не везде и не всегда работает, увы. Но так-то да.