Каждый, кто пользуется командной строкой Linux, встречался со списками полезных советов. Каждый знает, что повседневные дела вполне можно выполнять эффективнее, да только вот одно лишь это знание, не подкреплённое практикой, никому не приносит пользы.

Как выглядят типичные трудовые будни системного администратора, который сидит на Linux? Если абстрагироваться от всего, кроме набираемых на клавиатуре команд, то окажется, что команды эти постоянно повторяются. Всё выходит на уровень автоматизма. И, если даже в работе есть что улучшать, привычка противится новому. Как результат, немало времени уходит на то, чтобы делать так, как привычнее, а не так, как быстрее, и, после небольшого периода привыкания – удобнее. Помнить об этом, сознательно вводить в собственную практику новые полезные мелочи – значит профессионально расти и развиваться, значит – экономить время, которое можно много на что потратить.

image

Перед вами – небольшой список полезных приёмов работы с командной строкой Linux. С некоторыми из них вы, возможно, уже знакомы, но успели их позабыть. А кое-что вполне может оказаться приятной находкой даже для знатоков. Хочется надеяться, что некоторые из них будут вам полезны и превратятся из «списка» в живые команды, которыми вы будете пользоваться каждый день.

Вывод результатов работы команд в виде таблицы


Иногда вывод результатов работы команд выглядит как мешанина из беспорядочных строк. Найти то, что надо, в таких данных можно, но работать с ними неудобно. Например – что-то подобное можно получить в ответ на команду mount. Хорошо бы то же самое вывести в виде таблицы. И это не только возможно, но ещё и очень просто:

mount | column –t


Результаты работы команды mount, оформленные в виде таблицы

По умолчанию команда формирует табличное представление, ориентируясь на пробелы между словами. А что, если в качестве разделителей используются другие символы, вроде двоеточий? Например – в выводе cat /etc/passwd?

Упорядочить можно и такие данные – достаточно указать символ-разделитель с параметром –s. Например, ниже приведена команда для символа «:».

cat /etc/passwd | column -t –s:


Отформатированный вывод /etc/passwd

Многократный повтор команды до её успешного завершения


Если вы погуглите на эту тему, то обнаружите, что многие задают вопрос о том, как повторять команду до тех пор, пока она не будет успешно выполнена. Например, такое может быть полезным при пинге сервера до тех пор, пока он не откликнется, при проверке выгрузки файлов, или при опросе некоего URL до тех пор, пока он не окажется доступен.

Решить подобную задачу поможет цикл while true. Выглядит всё это так:


Команда будет повторяться до её успешного завершения

В этом примере конструкция >/dev/null 2>&1 перенаправляет вывод программы в /dev/null, включая и Standard Error, и Standard Out.

Вероятнее всего, это – один из самых полезных приёмов работы с командной строкой Linux.

Сортировка процессов по используемой памяти


Тут всё просто:

ps aux | sort -nk 4


Отсортированный список процессов

Сортировка процессов по использованию ресурсов CPU


Сортировка процессов по использованию CPU делается так:

ps aux | sort -nk 3


Отсортированный список процессов

Для того, чтобы вывести сведения об архитектуре, используйте команду getconf LONG_BIT.

Одновременный просмотр нескольких лог-файлов


Для просмотра лог-файлов вполне подходит команда tail, но иногда может понадобиться одновременная работа с несколькими подобными файлами. Для решения этой задачи подойдёт консольный инструмент multitail, который поддерживает выделение текста, фильтрацию и многие другие полезные возможности.


Работа с multitail

Установить эту утилиту, если вы её у себя не найдёте, можно командой apt-get install multitail.

Возврат к предыдущей директории


Для того, чтобы вернуться к предыдущей директории, просто наберите cd –.

Мониторинг с регулярными интервалами


Использование утилиты watch (например, watch df –h) поможет организовать наблюдение за выводом любой команды. Например, можно наблюдать за объёмом свободного пространства, и за тем, как он меняется.

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

Продолжение выполнения программы после окончания сессии


Когда вы запускаете любую программу в фоне и закрываете консоль, программа тоже завершит работу. А что, если надо, чтобы программа работала и после закрытия оболочки?

Для того, чтобы этого добиться, можно воспользоваться командой nohup, название которой расшифровывается как «no hang-up». Выглядит это так:

nohup wget site.com/file.zip

Пожалуй, эта команда – одна из тех, о которой забывают чаще всего, открывая по несколько окон терминала только ради исполняющихся в них команд.


Команда nohup

В примере, показанном на рисунке выше, в текущей директории будет создан файл nohup.out, содержащий вывод команды:


Файл nohup.out

Полезная штука, согласны?

Автоматический ответ yes или no


Предположим, вы хотите автоматизировать процесс, который требует от пользователя постоянно отвечать yes. Сделать это можно, используя команду yes:

yes | apt-get update

Возможно, вместо этого вы решите автоматизировать отрицательные ответы. Тут поможет такая конструкция:

yes no | command


Автоматизация ответа YES

Создание файла заданного размера


Создавать файлы заданного размера можно, используя команду dd:

dd if=/dev/zero of=out.txt bs=1M count=10

Вышеприведённая команда создаст файл размером 10 Мб, заполненный нулями.


Создание файла заданного размера

Выполнение последней команды с root-привилегиями


Иногда можно забыть ввести sudo перед командой, которой нужны root-привилегии. Вводить всё заново нет нужды – достаточно воспользоваться такой командой:

sudo !!


Выполнение последней команды с root-привилегиями

Создание протокола терминальной сессии


Для того, чтобы записать в файл всё, что было выведено в окне терминала, можно воспользоваться командой script.

После выхода из сессии протокол будет записан в файл typescript.

Замена пробелов на знаки табуляции


Вот команда, которая позволяет заменить пробелы на знаки табуляции:

cat geeks.txt | tr ':[space]:' '\t' > out.txt

На самом деле, она универсальна и умеет работать с любыми символами.

Замена строчных букв на прописные


А вот – пример вышеописанной команды для замены строчных букв в файле с текстом на прописные:

cat myfile | tr a-z A-Z > output.txt

image
Замена строчных букв в файле на прописные

Автоматическое формирование списка аргументов для команд: xargs


Утилита xargs, пожалуй, достойна звания одной из самых полезных возможностей командной строки Linux. Её можно использовать для передачи вывода некоей команды в качестве аргумента для другой. Например, вот как можно выполнить поиск .png-файлов и сжать их, или сделать с ними что-нибудь ещё:

find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz

Или, возможно, у вас имеется файл со списком URL, и вы хотите загрузить ресурсы по этим адресам, или ещё как-то их обработать:

cat urls.txt | xargs wget

Тут надо учитывать, что вывод первой команды передаётся в качестве аргумента в конце команды xargs. Если при конструировании второй команды надо явно указать место, куда должны попасть выходные данные первой, достаточно воспользоваться парой фигурных скобок, {} и параметром –i для замены аргумента в нужном месте:

ls /etc/*.conf | xargs -i cp {} /home/likegeeks/Desktop/out


Команда xargs

Итоги


Полезности для командной строки Linux – тема невероятно обширная. Поэтому любой список, подобный нашему, можно пополнять очень и очень долго. Например, много неожиданного скрыто в командах awk и sed. Пожалуй, главное – чтобы такие вот списки шли в дело.

А какими интересными приёмами работы в командной строке пользуетесь вы?
Поделиться с друзьями
-->

Комментарии (147)


  1. skymal4ik
    06.03.2017 14:53
    +3

    Спасибо, было интересно!

    Узнал про script, буду пробовать. Раньше бы сделал скриншот или фотку :)

    Заметка про замену табов\пробелов — для этого есть специальные тулзы. Но можно и через универсальный tr, как у вас.

    expand - convert tabs to spaces
    
    unexpand - convert spaces to tabs
    


    1. dmitryrublev
      06.03.2017 16:38

      Возможно, вам будет интересно: showterm.io, как ещё более «живая» альтернатива к script


      1. MarSoft
        08.03.2017 14:18

        Ещё asciinema.org, примерно аналог.


    1. jcmvbkbc
      07.03.2017 01:09
      +1

      Заметка про замену табов\пробелов — для этого есть специальные тулзы. Но можно и через универсальный tr,

      в отличие от expand и unexpand, tr заменит 8 идущих подряд пробелов на 8 табов.


    1. SerheoNikolis
      10.03.2017 08:18

      Я обычно копирую ~/.bash_history. При необходимости удалить за собой следы работы — history -cw.


  1. hungry_ewok
    06.03.2017 14:55
    +21

    >nohup wget site.com/file.zip
    >Пожалуй, эта команда – одна из тех, о которой забывают чаще всего,

    … потому что пользуются screen.


    1. dbax
      06.03.2017 15:16
      +7

      или tmux


      1. icoz
        07.03.2017 00:05
        +1

        или dtach


    1. Stronix
      07.03.2017 09:55

      … потому что есть wget -b :)
      А вообще же

      $ ping -c 5 google.com > out.txt 2>&1 &
      


      1. powerman
        07.03.2017 13:46

        Не-а. Это не спасёт от получения SIGHUP при отключении. Попробуйте сделать ssh localhost, запустить эту команду, а потом нажать ~. для разрыва ssh-сессии.


        1. Stronix
          07.03.2017 14:23

          Ага, nohup как раз и предназначена для игнорирования SIGHUP, просто я обычно закрываю сессию через EOF (Ctrl-d).


          1. atrosinenko
            07.03.2017 14:35

            А disown в такой ситуации не поможет? Что-то вроде "запустил с амперсандом, сказал disown, закрыл окно". Правда, stdout/stderr процесса всё равно будут идти в консоль, пока не закроешь.


            1. Stronix
              07.03.2017 14:49
              +1

              Ну, я скорее lammer, поэтому отвечу так.


              1. kstep
                09.03.2017 15:09

                Поэтому аналогом nohup на чистом шеле является такая конструкция: script.sh >&- 2> stderr.log <&- & disown. Такая команда закроет stdin и stdout, перенаправит stderr в файл лога, отправит задачу в фон и отсоединит от шела.


  1. safari2012
    06.03.2017 15:05
    +4

    Мне для фонового выполнения терминальной программы больше нравится screen


  1. mikhailian
    06.03.2017 15:20
    +2

    Запустить столько задач, сколько у меня есть процессоров:


    ls -1 |xargs -P `nproc` -n 1


  1. mikhailian
    06.03.2017 15:22
    -1

    Вырезать первую колонку из лога:


    cut -f1 -d\  /var/log/nginx/access.log


    1. AranelOfDoriath
      06.03.2017 16:52
      +1

      Либо
      cat /var/log/nginx/access.log | awk '{ print $1 }'


      1. Hamper
        06.03.2017 22:07
        +2

        Неплохой пример антипаттерна "useless cat" (кстати, к большинству команд в статье тоже относится). Короче и, в некоторых случаях, оптимальнее (например cat не позволяет командам использовать random access) писать так:


        awk '{ print $1 }' /var/log/nginx/access.log

        или так:


        < /var/log/nginx/access.log awk '{ print $1 }' 


        1. ZyXI
          06.03.2017 22:55

          Я не знаю, с какой радости это «антипаттерн». По производительности вы выиграете крохи, seek большинству программ, которые применяются в таких однострочниках нафиг не нужен, зато есть плюсы: можно быстро поменять cat на что?то ещё, можно быстро поменять команду на что?то ещё (обычно, конечно, меняется команда, а не cat), можно использовать с tr и файл явно визуально отделён от команды с помощью |. И ещё, команда нифига не знает, что это за файл, поэтому, к примеру, less не будет умничать и отображать не то, что я прошу (поведение less можно где?то настроить, но, во?первых, я не знаю, где, а, во?вторых, зачем настраивать на всех машинах less, если можно просто писать cat file | less?).


          1. Hamper
            07.03.2017 01:49
            +2

            Да, на мелких файлах незаметно, но когда нужно цепочкой файлик в несколько сотен Гб отфильтровать, то оптимизация пайпов становится заметной.
            Небольшой бенчмарк:


            #немножко тестовых строк (возможно, можно сделать это лучше, но мне ничего другое в голову не пришло) файл занял 200Мб
            pwgen -1 20 10000000 > test.txt
            time bash -c 'cat test.txt | sort > /dev/null' 
            # bash -c 'cat test.txt | sort > /dev/null'  51.26s user 1.05s system 99% cpu 52.354 total
            time bash -c 'sort test.txt > /dev/null' 
            # bash -c 'sort test.txt > /dev/null'  68.08s user 1.25s system 289% cpu 23.958 total
            time bash -c 'cat test.txt | sort | uniq > /dev/null'
            # bash -c 'cat test.txt | sort | uniq > /dev/null'  60.09s user 1.44s system 110% cpu 55.621 total
            time bash -c 'sort -u test.txt > /dev/null'
            # bash -c 'sort -u test.txt > /dev/null'  71.58s user 1.18s system 269% cpu 26.964 total

            Разница в 2 раза и неполное использование ядер процессора. Если мой бенчмарк неверен, то скажите пожалуйста где.


          1. CaptainFlint
            07.03.2017 01:58

            можно быстро поменять cat на что?то ещё
            Just FYI, в варианте с файлом-аргументом тоже можно легко поменять:
            awk '{ print $1 }' <(mutley do something)
            


            1. Shultc
              09.03.2017 13:04
              +1

              Не в коем случае не для спора, а в качестве дополнения:
              Очень часто использовал именно построение с «cat» при работе с большим числом логов, часть из которых уже заархивированна, а часть — ещё нет. Приходится лишь дописывать z, чтобы получить zcat:

              cat log.log | awk '{ print $1 }' 
              

              zcat log.log.gz| awk '{ print $1 }' 
              


              1. iig
                09.03.2017 13:45
                +1

                zcat -f log.log | awk '{ print $1 }'


  1. crezd
    06.03.2017 15:23
    +9

    Для сортировки процессов по разным параметрам удобней использовать htop.


    1. grossws
      06.03.2017 21:28
      +4

      Сам ps поддерживает сортировки: ps auxk +%mem,+%cpu


  1. TaHKucT
    06.03.2017 15:46
    +2

    Одновременный просмотр нескольких лог-файлов

    Вполне можно сделать
    tail -f file1 file2
    

    Строчки будут появляться на экране по мере записи в файл. Не очень удобно, тем что они «перемешиваются», но в один лог падает много, а в другой мало (например access и error логи, в error очень редко что-то попадает), то вполне приемлемо.


    1. Alkop
      06.03.2017 18:10

      Или lnav (требует установки), но полноценная программа для парсинга логов.


    1. bykvaadm
      07.03.2017 12:19

      а еще tail -f можно заменить на tailf — это отдельный бинарь, который умеет тоже самое.


      1. anton_slim
        08.03.2017 09:25

        проще прописать в .bashrc алиасы вместо отдельного бинарника
        alias tailf='tail -f'

        по мимо этого я еще использую такие:
        # some more ls aliases
        alias ll='ls -alF'
        alias la='ls -A'
        alias l='ls -CF'
        # git
        alias gl='git log'


        1. bykvaadm
          14.03.2017 10:46

          если вы внимательно посмотрите на debian-подобные дистрибутивы последних как минимум 3-х лет, то вы увидите что этот бинарь УЖЕ есть в вашей системе.


          1. ZyXI
            14.03.2017 10:56
            +3

            У меня Gentoo, там и в man tailf, и в tailf --help явно написано, что оно “deprecated” и “may have unfixed bugs and will be removed from util-linux in March 2017”. Так что не уже есть, а ещё есть, если только в debian не будут зачем?то поддерживать эту программу своими силами. Напомнить, какой месяц сейчас? Конечно, когда это изменение окажется в последней стабильной версии будет уже не март, но всё равно лучше написать alias.


            1. bykvaadm
              14.03.2017 11:21

              ifconfig тоже deprecated, однако даже в манах от известных IT компаний до сих пор он упоминается. Бинарь до сих пор присутствует в системе и ничего. Работает. И если уж настройку сети люди выполняют с помощью deprecated-средств, то уж извините, простую задачу по выводу на лету информации из файла я могу доверить и tailf. тем более за все годы я не замечал за ним какой либо нестабильной работы.
              По по-воду «еще» и «уже», окей, не знал. тем не менее не вижу причин не использовать эту утилиту.


              1. ZyXI
                14.03.2017 11:29

                ifconfig пока не удаляют. И в man ifconfig слов «deprecated» или «obsolete» у меня нет. В интернете можно найти man ifconfig, где говорят про «obsolete», но заявлений вида «ifconfig будет удалён {дата}» нет и там.


              1. ZyXI
                14.03.2017 11:37

                tail, кстати, умеет вещи вроде «завершись, когда процесс с PID умрёт», «пробуй читать файл, даже если он удалён», «переоткрой файл, если его размер не изменился за N итераций», «читай файл каждые N секунд». Ничего из этого tailf не умеет, а единственный ключ (кроме версии и помощи) -n/--lines/-{number} совместим с tail (версия и помощь, правда, не совместимы: tail не поддерживает короткие варианты -V и -h). Ну и в чём смысл использовать tailf вместо aliasа?


                1. bykvaadm
                  14.03.2017 11:53

                  отвечу как владелец айфона, загнанный в угол: «а мне этот функционал и не нужен» =)


          1. anton_slim
            14.03.2017 11:01

            И вправду ) спасибо не заметил


  1. qlkvg
    06.03.2017 15:47
    +16

    Установить эту утилиту, если вы её у себя не найдёте, можно командой apt-get install multitail.

    linux != debian
    find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz

    Чтобы xargs'у не снесло крышу, необходимо поменять -print на -print0 и добавить -0 после xargs. Тогда файлы с пробелами в названии будут интерпритироваться как один файл, а не несколько.


    1. haoNoQ
      06.03.2017 18:12
      +6

      И ещё хорошо бы закавычить *.png, иначе команда find будет вести себя неожиданно, если в текущей папке есть хотя бы один .png-файл.


      1. ZyXI
        06.03.2017 20:01

        А чтобы поменьше забывать о таких нюансах хорошо бы использовать setopt NOMATCH (zsh) / shopt -s failglob (bash) в интерактивной оболочке. Тогда вы получите либо ошибку, либо имена файлов, но вряд ли получите *.png (если только у вас нет файла с таким именем, что крайне маловероятно).


    1. powerman
      07.03.2017 13:51
      +2

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


  1. mazy
    06.03.2017 15:48

    еще logtop хорошая штука


  1. antstar
    06.03.2017 15:54
    +1

    apt-get install pkg -y


    1. IvanIvanov1992
      06.03.2017 18:02
      +2

      Видимо yes и no более универсальна и позволяет отвечать на вопросы в командах, где нет параметров для «автоответов». На мой взгляд может быть удобно.


  1. nckma
    06.03.2017 16:07

    если когда-то набирал команду, но не очень помнишь детали или синтаксис (например как установить vpn соединение), то
    history | grep openconn


    1. ProFfeSsoRr
      06.03.2017 17:13
      +5

      В bash можно Ctrl+R и начать набирать openconn — последняя подходящая команда из истории отобразится.


      1. 027
        06.03.2017 17:58
        +1

        А если еще раз Ctrl+R, предпоследняя и т.д.


      1. Alkop
        09.03.2017 10:50

        А если установить hh — то по Ctrl+R еще круче штука запустится :)

        add-apt-repository ppa:ultradvorka/ppa
        apt-get update
        apt-get install hh
        


    1. Mobyman
      06.03.2017 17:15
      +4

      А почему не Ctrl+R?


    1. marapper
      07.03.2017 11:40
      +1

      лучше history | grep [o]penconn — и в результатах не будет этого последнего грепа.


  1. madkite
    06.03.2017 16:22
    +4

    Вместо


    while true
    do
    ping -c 1 google.com >/dev/nill 2>&1 && break
    done ;

    В современных версиях bash-а можно написать просто:


    while ! ping -c1 google.com &>/dev/null; do done

    И даже можно использовать "until" вместо "while !".


    1. ZyXI
      06.03.2017 19:53

      В dash (и, наверное, в несовременных версиях bash) это запишется как until command ; do :; done. В zsh, кстати, можно сократить до until {command} {}, если фигурные скобки вам нравятся больше, чем do/done.


    1. powerman
      07.03.2017 13:52

      А если команда может выполняться моментально, то внутри do/done не помешает sleep 1.


  1. Hamper
    06.03.2017 16:32
    +6

    Файлы быстрее создавать через fallocate (особенно актуально для больших, типа свопа):


    fallocate -l 10M out.txt


    1. laurvas
      11.03.2017 08:07

      fallocate работает только на файловых системах, поддерживающих разреженные (sparse) файлы. Лучше использовать truncate. Судя по его поведению, он создаёт разреженный файл там, где это возможно, и заполняет нулями там, где нет.

      truncate -s 10M out.txt
      



  1. Stanleygoo
    06.03.2017 17:13

    cat /etc/passwd | column -t –s:

    После -s нужно пробел поставить.


    1. ZyXI
      06.03.2017 20:04
      +1

      column из sys-apps/util-linux-2.28.2, работает без пробела.


      1. Stanleygoo
        06.03.2017 22:48
        +1

        Может быть. У меня в последнем Debian'e без пробела не получилось, пишет:


        column: –s:: No such file or directory


        1. ZyXI
          06.03.2017 22:58

          И при чём тут пробел? Замените короткое тирэ на дефисоминус. Или возьмите работающую команду и удалите пробел там: раз она работает, то вы её перепечатали, а не скопировали.


        1. vovka667
          06.03.2017 23:43
          +2

          Проблема не в пробеле, а в том, что хабр заменил символ чёрточки. Введите -s вручную и всё будет ок.


  1. camac
    06.03.2017 17:13

    У меня на

    mount | column –t
    

    матерится:
    column: –t: Нет такого файла или каталога
    


    1. TaHKucT
      06.03.2017 17:22
      +4

      хабр или браузер заменяют «обычный минус» на длинный. Наберите "-t" на клавиатуре, а не скопируйте — и все будет работать.


      1. camac
        06.03.2017 17:30

        Спасибо.
        Вот что с людьми лень делает.


      1. ZyXI
        06.03.2017 20:09
        +1

        «Обычный минус» называется «дефисоминус» (U+002D HYPHEN-MINUS). А замена в комментарии не «длинный минус», а «короткое тирэ» (U+2013 EN DASH). Минус в юникоде тоже есть, и даже не один. По «чёрточкам» на хабре есть статья: https://habrahabr.ru/post/20588/.


        Кстати, именно «длинного минуса» я в юникоде как?то не вижу. Есть тяжёлый.


    1. powerman
      07.03.2017 13:59

      Ещё одна проблема с column — он не умеет учитывать ANSI escape sequence, поэтому есть вывод mount расцвечивается чем-нить вроде grc то фактически
      mount | column -t
      превращается в
      grc /bin/mount | column -t
      и колонки ломаются. Починить можно изменив порядок, но это набирать уже не очень удобно:
      /bin/mount | column -t | grcat conf.mount


  1. crocodile2u
    06.03.2017 17:42
    +1

    top интерактивный. Нажмите "?" для справки, там много полезного.


  1. JTG
    06.03.2017 17:48
    +6

    Командой «git checkout -» можно переключаться туда-сюда между двумя последними ветками, как и в cd.


  1. NaHCO3
    06.03.2017 18:12
    +1

    script ещё полезен для запуска screen внутри себя. Бывает так, что злобный тюремщик не оставляет тебе доступа даже к /dev/tty. screen без свободных tty запускаться не согласен — script может создать для него в юзерспейсе.


  1. ArsenAbakarov
    06.03.2017 18:12

    Узнал несколько новых полезных вещей, спасибо, вообще использую guake + tmux, неплохо получается работать с несколькими серверами, главное отдавать отчет где сейчас находишься)


    1. tacitus
      06.03.2017 19:15

      это точно.


    1. bykvaadm
      07.03.2017 12:23

      а у вас при создании новой вкладки в guake переименовываются все оставшиеся на дефолтные значения? ибо у меня именно так и происходит и это жутко бесит. хотя кроме guake я ничего не признаю больше)


      1. Crandel
        13.03.2017 18:02

        Terminator или Terminix намного функциональнее guake, там можно сплитить сам терминал, на локальной машине спасает от кучи вкладок или если нужно сравнить содержимое двух вкладок. Сам перешел с Terminator на Terminix, потому что последний на D написан и очень активно развивается


        1. bykvaadm
          14.03.2017 11:29

          самая удобная фича, которая мне нужна у guake — возможность выпадения консоли в верхней части экрана по хот кею, с настройкой прозрачности. что позволяет удобно пролистывать маны (сквозь терминал, если нужно), разворачивая полностью, частично или вовсе скрывая консоль.


          1. Crandel
            14.03.2017 11:35

            Тоже самое есть в 2 приведенных терминалах, для меня это тоже очень критичный функционал терминала


            1. bykvaadm
              14.03.2017 11:51

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


  1. WebMonet
    06.03.2017 18:25
    +3

    cat urls.txt | xargs wget == wget -i urls.txt


    1. iig
      07.03.2017 11:56

      cat urls.txt | wget -i -


      1. A044
        08.03.2017 00:59

        wget -i urls.txt


        1. iig
          08.03.2017 02:10

          cat urls.txt | ssh user@host 'wget -i -'


  1. alex518
    06.03.2017 19:15
    +1

    Вместо nohup ещё можно воспользоваться командой disown.


  1. delvin-fil
    06.03.2017 19:25
    +1

    cat myfile | tr a-z A-Z > output.txt

    cat myfile | tr "[:lower:]" "[:upper:]" > output.txt


  1. Amet13
    06.03.2017 20:03
    +2

    В каком случае apt update может понадобиться yes? Он же вроде вопросов не задает, другое дело apt install/remove.

    image


    1. georgevp
      07.03.2017 06:43

      dist-upgrade задает вопрос.


  1. Niomin
    06.03.2017 21:46

    Если мне хочется, чтобы что-нибудь выполнялось после закрытия консоли, я обычно запускаю в фоне (& на конце). Что позволяет nohup/script, чего не даёт просто фоновый режим?


    1. Hamper
      06.03.2017 22:15

      При закрытии терминала (в том числе, разрыв соединения, если это ssh), процессы, запущенные в нем, получат SIGHUP, а большинство приложений по нему закрываются.


    1. laviro
      06.03.2017 22:21
      +1

      этого не достаточно.
      По идее перед закрытием консоли еще нужно выполнить: disown -h


  1. andreios
    06.03.2017 22:32
    +2

    Как ни странно, с учетом, что все примеры хорошо знакомы, самым неожиданным и приятным открытием стало узнавание про таблицификацию вывода… Очень круто, спасибо!


  1. E_STRICT
    06.03.2017 22:43

    Есть хорошая книжка на эту тему.


    1. romanegunkov
      07.03.2017 00:30

  1. romanegunkov
    06.03.2017 23:44
    +1

    Где приемлемо подождать, лучше вместо


    while true

    использовать


    while sleep 1

    Когда-нибудь вспомните хорошим словом.


    1. bykvaadm
      07.03.2017 12:25
      +1

      подобный пример без разъяснения ничего не стоит.


      1. NaHCO3
        07.03.2017 13:46

        Успеете нажать Ctrl+C прежде чем вас выкинет из ssh сессии


  1. romanegunkov
    07.03.2017 00:22

    С xargs надо быть внимательным на больших списках, чтобы не случилось беды как в примере ниже.


    См. man 1 xargs
    --max-chars=max-chars
    -s max-chars


    romanegunkov@re-host0:~/1-tmp/2/22$ seq -f filename%g.png 1 20000 | xargs echo tar -cvzf ALL.tar.gz | grep -o -e 'tar.\{60\}'
    tar -cvzf ALL.tar.gz filename1.png filename2.png filename3.png 
    tar -cvzf ALL.tar.gz filename7774.png filename7775.png filename
    tar -cvzf ALL.tar.gz filename15178.png filename15179.png filena
    romanegunkov@re-host0:~/1-tmp/2/22$ 


  1. iasonov
    07.03.2017 01:15
    -2

    nohup wget site.com/file.zip

    Можно ведь просто поставить "&" после команды?
    wget site.com/file.zip &


    1. kozt
      07.03.2017 03:08
      +3

      отправить задачу в бэкграунд и отцепить ее от tty (что и делает nohup) — 2 разные вещи


  1. klirichek
    07.03.2017 04:26
    +2

    Для создания файла определённого размера иногда всё же лучше не копировать нули, а сделать seek. Это и быстрее, и экономит ресурс ssd (если файл создаётся там). Правда, при этом для создания файла точно заданного размера придётся заняться арифметикой (чтобы скипнуть на нужный размер без единицы, а потом дописать 1 байт). Но и это можно упростить, если писать не байт, а удобное количество нулей, чтоб мозг не напрягать (например, для 100М файла не bs=1 count=1 seek=104857599, что трудно считать или помнить, а bs=1k count=1 seek=102399, что уже тривиально)


    Другое дело, если нужно не просто создать файл, а именно выделить (зарезервировать) место. Там да, придётся честно писать все нули.


  1. shcoderAlex
    07.03.2017 04:47
    +1

    #Последний аргумент предыдущей команды 
    $_
    #Удобно создавать директорую и переходить в неё
    mkdir /var/www/project && $_
    


    1. Sirikid
      07.03.2017 10:20

      Старая добрая mkcd (у меня не bash и не zsh если что)


      mkcd() {
          if [ -z "$1" ]; then
              echo 'mkcd: Name expected'
              return 1
          fi
          mkdir -p "$1" && cd "$1"
      }


    1. nlykl
      09.03.2017 18:41

      Точно так же работает +<.> при вводе с клавиатуры.


      1. nlykl
        10.03.2017 00:00

        ESC + <.>, конечно же.


      1. Hissing_Bridge
        10.03.2017 08:19

        alt + <.> значительно удобнее, как и навигация типа alt + p, alt + b, alt + f


  1. immaculate
    07.03.2017 09:44

    Статья для совсем новичков. Помню, раньше во всяких TLDP, LinuxJournal, LWN.net и т.д. печататлись статьи о совершенно зубодробительных командах и их комбинациях, типа, как передать бэкап каталога по ssh при помощи tar и т.п.


    В примере с пингом google лучше вставить sleep 30s или еще больше: к чему мучить несчастные сервера непрерывным пингом… Один хост погоды не сделает, но если все начнут писать подобные скрипты, то начнется DDOS. Особенно когда какой-нибудь китайский или филиппинский недоучка прочитает подобную статью и впендюрит подобный скрипт в прошивку недорогого, но распространенного роутера.


    1. grossws
      07.03.2017 11:00
      +2

      Статья для совсем новичков. Помню, раньше во всяких TLDP, LinuxJournal, LWN.net и т.д. печататлись статьи о совершенно зубодробительных командах и их комбинациях, типа, как передать бэкап каталога по ssh при помощи tar и т.п.

      Что зубодробительного в tar c files | ssh user@host 'tar x -C /dest/dir/'? И местами ощутимо лучше и приятнее scp (в смысле preserve атрибутов, если на второй стороне root.


      В примере с пингом google лучше вставить sleep 30s или еще больше: к чему мучить несчастные сервера непрерывным пингом… Один хост погоды не сделает, но если все начнут писать подобные скрипты, то начнется DDOS.

      До DDOS'а там ещё далеко, icmp довольно дешевый. Куда удобнее tcp syn flood, он хоть разумную амплификацию даёт. Для непрерывного ping'а есть ключ -f, который означает flood ping и без задержки минимум в 0.2с не доступен непривилегированному пользователю.


      1. immaculate
        07.03.2017 11:15

        DDOS начнется, когда десятки тысяч людей начнут использовать это в своих скриптах. Да и просто с дидактической точки зрения стоит объяснить, почему плохо, когда в примере в скрипте нет никакой задержки. Получается нерациональное решение, которое раз 5 в секунду запускает ping зря поедая ресурсы компьютера и сети.


        По поводу сложности, в статье изложены самые азы работы с командной строкой, впрочем, даже из азов изложены не все. Таких статей в сети 100500 миллионов, каждый блоггер отмечается на этой ниве. «А вы знаете, что в командой строке Ctrl-A переходит в начало строки?»


        Хотелось бы более изощренных примеров, в статье с таким заголовком, вот и все.


        1. YaakovTooth
          09.03.2017 04:12
          +1

          то начнется DDOS

          DDOS начнется


          Не начнётся.


      1. bykvaadm
        07.03.2017 12:30

        но ведь автор просто привел пример «полезной нагрузки» для используемой комбинации. в том то и соль что если вы не новичок, то вы просто оцениваете конструкцию и уж её применяете под свои задачи, используя другие команды вместо пинга и регулируя время между их запусками с помощью sleep.


      1. acmnu
        07.03.2017 13:19

        И местами ощутимо лучше и приятнее scp (в смысле preserve атрибутов, если на второй стороне root.

        Самое главное значительно быстрее, поскольку scp не умеет организовывать сплошной поток и на кучке маленьких файлов никогда не добиться скорости сравнимой с tar.


  1. MasMaX
    07.03.2017 10:36
    +2

    Недавно для себя открыл фигурные строки в linux. Удобно создавать сразу много каталогов. Или применять параметры для многих каталогов.
    Например нам нужна такая структура:
    /var/lib/project1/test
    /var/lib/project2/test

    Создать эти каталоги можно одной командой:

    mkdir -p /var/lib/{project1,project2}/test
    


    1. E_STRICT
      07.03.2017 11:33
      +4

      Немного короче:

      mkdir -p /var/lib/project{1..10}/test
      

      Ещё удобно переименовывать или копировать файлы в пределах одной директории.
      mv /long/path/to/file.txt{,.orig}
      


  1. centner100
    07.03.2017 10:49

    Пропинговать и получить ответ от всех хостов в сети.
    echo 192.168.1.{1..254}|xargs -n1 -P0 ping -c1|grep «bytes from»


    1. grossws
      07.03.2017 11:03
      +2

      nmap -sn 192.168.1.0/24, зачем эти извращения?


      1. centner100
        07.03.2017 16:52

        К сожалению, не всегда имеется доступ к мировой паутине. Иногда он и вовсе запрещен.
        # nmap
        bash: nmap: команда не найдена
        Съемный носитель с тулзами тоже не панацея. Его можно банально потерять/сломать/забыть.
        echo, xargs, ping, grep — стандартные программы с большой вероятностью присутствующие в ОС.


        1. grossws
          07.03.2017 17:10

          Если вы говорите про prod с отсутствием доступа к интернету и внутреннему зеркалу, то никто не мешает поставить нужное барахло в базовом образе/kickstart'е при установке и т. п.


          find/xargs (findutils) тоже могут отсутствовать, например. Всё зависит от того, что за базовый образ. То может быть мы вообще в контейнере с одним статическим бинарником, собранным против musl.


          1. romanegunkov
            08.03.2017 00:13

            Иногда помогает заглянуть в busybox, если он есть. busybox --help покажет что встроено. Например, нужен uuencoode, в на системе нет.


            romanegunkov@re-host0:~$ echo Hello | uuencode -m -
            -bash: uuencode: command not found
            romanegunkov@re-host0:~$ echo Hello | busybox uuencode -m -
            begin-base64 644 -
            SGVsbG8K
            ====
            romanegunkov@re-host0:~$ 
            


  1. BigEl
    07.03.2017 11:12

    Жесть, глазами Виндузятника бОльшая часть написанного здесь читается сложнее корейский иероглифов, тем не менее иногда сталкивался с различными проявлениями юникс систем на декстопных тачках, как то даже вторую систему дома ставил (не пошла, знаний не хватило освоить даже на уровне юниора).
    Но… прочел с удовольствием, проснулось желание повторить попытку знакомства. Пользуясь случаем поинтересуюсь у гуру данной платформы, с чего лучше начать почти новичку в данной области. Много читал про Debian, но тем не менее по обзорам и функционалу привлекает Arch Linux — не будет ли он слишком сложен в освоении? Какие еще варианты можете предложить?


    1. ZyXI
      07.03.2017 11:14

      Я начинал с Ubuntu, потом прямо из неё ставил Gentoo. По?моему, с неё всегда проще всего начинать.


      1. BigEl
        07.03.2017 11:27

        Вот Ubuntu то и пробовал когда-то, v10 или v12 дистриб. Поставить и немного настроить проблем не вызвало (гугл помог), даже какой то типовой софт поставил через apt-get install, не помню уже на чем запнулся и забил…


    1. grossws
      07.03.2017 11:47
      +1

      Я бы не рекомендовал Arch первой системой, у новичка он будет ломаться пять раз на дню, а через неделю забросите.


      Для обучения лучше берите kubuntu/ubuntu, ставиться за 10-20 минут, почти никакого геморроя. Желательно перед установкой убедиться, что всё железо на машинке адекватное, то, опять же, намучаетесь.


      Лучше поставить в виртуалку, сделать базовый образ и после этого ломать систему разными способами и пытаться восстановиться. Всякие стандартные вещи типа опечатка в /etc/fstab, полностью забитый диск, смонтированный на /, неудачно снесенное ядро и т. п.


      А потом можно уже спокойно брать Arch или Gentoo. Кстати, при работе и настройке вне зависимости от дистрибутива в вики арча и генты можно найти ответы на многие вопросы.


      1. BigEl
        07.03.2017 12:00

        Есть тестовая машинка, физическая: Камень Intel 2030 на 2.4 Hz, мать Асусовая из бюджетных, хард 200gb с копейками. Не люблю виртуалками баловаться на основной домашней машинке, «хвостов» куча остается или руки из зад кривые, был период когда на виртуалке Андроид десктопный тестировал (банально ради интереса, поковырять внутрянку без залоченности телефона), пару раз «окошки» переустанавливал, постоянно где то кучи файлов забивались на диске, в реестре много всего понаписалось. Поэтому собрал средненький комп для тестов всего нового, непроверенного и заведомо опасного. Так сказать физическая виртуалка ))


    1. Sirikid
      07.03.2017 12:08

      Если осилишь арч все остальное будет довольно просто, у него очень хорошая документация (арчвики).


    1. centerv
      07.03.2017 18:44

      Рекомендую arch. Если бы начинал с него, знакомство с Linux было бы на порядок продуктивнее. Ещё ставь zsh, oh-my-zsh.


    1. centerv
      07.03.2017 18:46

      А хочется десктоп то antergos. Это тоже arch, но красивый с установщиком. После кучи маков пересел.


    1. romanegunkov
      08.03.2017 00:25

      Сначала возьмите Debian или что-то популярное на на его основе Mint/Ubuntu, чем больше сообщество и документации, тем вам проще будет искать ответы на поисковиках. Когда освоитесь, этот момент можно определить как — вспомнил что ещё осталась винда на компе, надо бы снести, поработайте с CentOS, основан на Red Hat и опыт пригодится в работе. А потом можете пробовать что угодно, хоть Arch хоть Gentoo.


    1. YaakovTooth
      09.03.2017 04:14
      -2

      прочел с удовольствием, проснулось желание повторить попытку знакомства

      7 марта 2017 в 11:12


      Слишком жирно.

      гуру данной платформы, с чего лучше начать почти новичку


      1. BigEl
        09.03.2017 08:12
        +2

        Уважаемый, где жирноту узрели?


  1. tarasui
    07.03.2017 15:02

    Жаль нет кнопки сохранить


  1. Andronas
    07.03.2017 15:02

    Вместо nohup можно использовать at now (или at на конкретное время)


    1. grossws
      07.03.2017 17:11

      Если он вообще разрешен


  1. DmitriyPanteleev
    07.03.2017 15:02

    Просто оставлю это здесь :-)

    Джоршуа Леви «Искусство коммандной строки»

    https://github.com/jlevy/the-art-of-command-line/blob/master/README-ru.md


  1. bubuq
    07.03.2017 19:24

    cat /etc/passwd | column -t –s:

    column -t –s: < /etc/passwd


    cat myfile | tr a-z A-Z > output.txt

    tr a-z A-Z > output.txt < myfile


    sudo !!

    меж тем "!!" это повтор последней команды в любом контексте, sudo тут ни при чём.


    1. ZyXI
      07.03.2017 23:28
      +1

      !! — это ни разу ни повтор какой?либо команды. Это history expansion: подстановка из истории. Ничто не мешает вам написать for arg in !! ; do echo $arg ; done: найдите здесь «повтор последней команды». !! при этом не единственный вариант: можно и взять предыдущую строку, соответствующую регулярному выражению, оставить от неё второе слово (оно же обычно первый аргумент) и заменить в этом слове x на y: !?regex?:1:s/x/y/.


      В любом случае, подстановка из истории оперирует не с командами, а со строками: «первым аргументом» в примере вполне может оказаться и |, a ?sudo может заполучить while и, разумеется, не знать, что с ним делать (это часть синтаксиса оболочки и ни разу не команда, даже не shell builtin).


  1. troggy
    08.03.2017 20:08
    +2

    Алиас для более семантичного выполнения последней команды под рутом:

    alias please='sudo $(fc -ln -1)'
    


  1. BigEl
    09.03.2017 08:28
    -1

    Как относитесь к обучению основ в игровом виде?
    Вчера нашел игрушку Hacknet

    рандомный скрин игрового интерфейса с просторов ынтерета
    image


  1. abyrkov
    09.03.2017 18:57

    После выхода из сессии протокол будет записан в файл typescript.

    Макрософт уже в суд подавал?


  1. starfolk
    10.03.2017 02:35

    а как послать в ребут после отработки команды. конкретно мне надо что бы после yum update -y комп перезагружался


    1. senia
      10.03.2017 07:59
      +1

      А что мешает так и написать? yum upate -y && reboot
      Стандартный способ объединять последовательно несколько команд пока они успешно выполняются — через &&.
      Хотите продолжить цепочку даже в случае ошибки — замените && на ;.


  1. klounader
    11.03.2017 08:07

    Когда-то я не знал, как в фильмах так быстро набирают в консоли всякие хакерские слова.
    С помощью Tab-а дополнять набирающее стало намного проще.
    В чём отличие cd -. от cd…?


    1. SeveneduS
      11.03.2017 10:30
      +1

      cd- «предидущая директория» — та в которой вы были ранее. cd… — подняться на папку выше.
      Пример:
      Вы были в /home/user/folder5/, потом попали в директорию к примеру — /usr/lib/. если наберёте команду cd- то сразу вернётесь из /usr/lib/ в /home/user/folder5/. В случае же если вы из /usr/lib/ наюерёте cd… то попадетё всего лишь в /usr/


      1. klounader
        11.03.2017 11:34

        Понято, спасибо.


  1. SeveneduS
    11.03.2017 15:34
    +2

    Ну раз уж утилиту (команды это не что иное как скрипты либо утилиты/программы)

    du
    никто не упомянул то пожалуй это сделаю я. du -sh к примеру выводит размеры папок либо даже отдельных файлов. К примеру если запустить эту команду:
    sudo du -sh /
    

    Мы получим что то типа:
    4.9G    /
    


    А вот если добавить * сразу после дроби (sudo du -sh /*) то вывод будет ещё интереснее:
    7.4M    /bin
    21M     /boot
    0          /dev
    6.9M    /etc
    12M     /home
    148M    /lib
    16K     /lost+found
    20K     /man
    4.0K    /media
    4.0K     /mnt
    797M   /opt
    0           /proc
    28K      /root
    6.5M    /run
    7.0M    /sbin
    4.0K     /srv
    0           /sys
    52K      /tmp
    3.6G     /usr
    362M    /var
    
    


    При поиске мусора захлямляющего диск для меня это порой единственный весомый иснтрумент.


    1. E_STRICT
      11.03.2017 15:59
      +3

      ncdu попробуйте


    1. Merlyel
      11.03.2017 19:41

      Ну и заодно du -sh * |sort -h, чтобы сразу отсортировать корректно
      Правда -h в sort'е появился относительно недавно.


      1. servarius
        13.03.2017 08:27

        Я бы использовал #du -sm, Он на большинстве версий *nix работает одинаково. Только HP-UX отличается. Зато даже на AIX показывает в мегабайтах.



  1. Hissing_Bridge
    13.03.2017 05:20
    +5

    Еще очень удобная фишка, если нужно отредактировать/написать длинную команду, к примеру какой-то цикл. Последовательность Ctrl + x, Ctrl + e запустит редактор, установленный переменной окружения EDITOR, в котором уже изменить скрипт, а по закрытию он выполнится
    http://i.imgur.com/jmXmr3S.gifv


    1. iig
      14.03.2017 15:08

      Спасибо, man bash до этого места я не дочитал ;)


  1. scorp13
    14.03.2017 14:38
    +1

    Недавно делал себе небольшую шпаргалку по командам терминала.