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



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

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

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

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

  2. pae174
    /#24365866 / +6

    pkill fire*

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

    pkill "fire*"

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

  3. FanatPHP
    /#24365922 / +11

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

    • nronnie
      /#24365958 / +2

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

    • funca
      /#24366008 / +3

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

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

      • nronnie
        /#24366336 / +2

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

  4. magrif
    /#24365924

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

  5. A1EF
    /#24365928 / +1

    curl ifconfig.me ; echo

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

    curl -w'\n' ifconfig.me

    • 13werwolf13
      /#24366392 / +1

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

      echo $(curl -s 2ip.ru)

      • karavan_750
        /#24366706

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

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

        • ConstSe
          /#24366766

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

          wget -qO- eth0.me

          • CaptainFlint
            /#24366914 / +2

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

            • alex1478
              /#24367038 / +1

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

  6. yulchurin
    /#24366132 / +1

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

    • CaptainFlint
      /#24366360 / +2

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

      • firefox85
        /#24367294

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

        • citius
          /#24367324

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

        • 4eburashk
          /#24371420

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

  7. xunixx
    /#24366134 / +1

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

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

    • Harliff
      /#24366730

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

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

      • igorp1024
        /#24368506

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

    • MAaxim91
      /#24368564

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

  8. skozharinov
    /#24366136

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

    • nronnie
      /#24366300 / +1

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

      • skymal4ik
        /#24366430

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

  9. crawlingroof
    /#24366158

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

    • skozharinov
      /#24366174

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

      • crawlingroof
        /#24366250

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

  10. CaptainFlint
    /#24366368 / +3

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

    • 13werwolf13
      /#24366400 / +1

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

    • AlexGluck
      /#24367478

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

      • CaptainFlint
        /#24367574

        А потом в середине сломается, потому что папка уже есть.
        Во-первых, mkdir создаст остальные каталоги. Во-вторых, независимо от того, какую проблему мы пытаемся решить, фигурные скобочки в приведённой мной цитате абсолютно ничего не решают. Формула {images,css,src,templates,scripts} на самом деле ещё перед выполнением команды разворачиваются шеллом в обычный список images css src templates scripts, и mkdir получает на вход именно этот список, и потом просто идёт по нему, создавая каталоги. Если пользователь вручную напишет точно такой же список с пробелами, с точки зрения mkdir абсолютно ничего не поменяется.
        Лучше делать mkdir -p somedir/otherdir/{raz,dva,tri}
        А это уже как раз пример, где у перечисляемых элементов есть общая часть, вынесенная за скобки.

  11. Harliff
    /#24366702

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

  12. Harliff
    /#24366708 / +1

    >sed s'_apples_oranges_g' myfile.txt

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

  13. Alghazanth
    /#24366836 / +1

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

  14. karavan_750
    /#24366852

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

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

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

    • 13werwolf13
      /#24367678 / +1

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

      inxi -Fxxx

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

  15. vodopad
    /#24366960

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

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

  16. ALiEN175
    /#24367562

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

  17. KoCMoHaBT61
    /#24367664 / +1

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

  18. Japet
    /#24367992

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

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

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

  19. neznaju
    /#24368210

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

  20. OnlySlon
    /#24368970

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

    • CaptainFlint
      /#24369032

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

      • OnlySlon
        /#24372444

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

        • CaptainFlint
          /#24372770

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

  21. Sergey1124
    /#24369106

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

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

  22. klounader
    /#24369282

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

    • dlinyj
      /#24369760

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