6 марта в 14:24

Самые полезные приёмы работы в командной строке Linux перевод

Каждый, кто пользуется командной строкой 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. Пожалуй, главное – чтобы такие вот списки шли в дело.

А какими интересными приёмами работы в командной строке пользуетесь вы?
Автор: @ru_vds Seco Max
RUVDS.com
рейтинг 530,02
RUVDS – хостинг VDS/VPS серверов
Похожие публикации

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

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

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

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

    expand - convert tabs to spaces
    
    unexpand - convert spaces to tabs
    
    • 0
      Возможно, вам будет интересно: showterm.io, как ещё более «живая» альтернатива к script
      • 0

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

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

      в отличие от expand и unexpand, tr заменит 8 идущих подряд пробелов на 8 табов.
    • 0
      Я обычно копирую ~/.bash_history. При необходимости удалить за собой следы работы — history -cw.
  • +21
    >nohup wget site.com/file.zip
    >Пожалуй, эта команда – одна из тех, о которой забывают чаще всего,

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

    • +7
      или tmux
      • +1
        или dtach
    • 0
      … потому что есть wget -b :)
      А вообще же
      $ ping -c 5 google.com > out.txt 2>&1 &
      
      • 0

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

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

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

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

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

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

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


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

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


    cut -f1 -d\  /var/log/nginx/access.log
    • +1
      Либо
      cat /var/log/nginx/access.log | awk '{ print $1 }'
      • +2

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


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

        или так:


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

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

          • +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 раза и неполное использование ядер процессора. Если мой бенчмарк неверен, то скажите пожалуйста где.

          • 0
            можно быстро поменять cat на что‐то ещё
            Just FYI, в варианте с файлом-аргументом тоже можно легко поменять:
            awk '{ print $1 }' <(mutley do something)
            
            • +1
              Не в коем случае не для спора, а в качестве дополнения:
              Очень часто использовал именно построение с «cat» при работе с большим числом логов, часть из которых уже заархивированна, а часть — ещё нет. Приходится лишь дописывать z, чтобы получить zcat:
              cat log.log | awk '{ print $1 }' 
              

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

              • +1
                zcat -f log.log | awk '{ print $1 }'
  • +9
    Для сортировки процессов по разным параметрам удобней использовать htop.
    • +4

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

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

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

    Строчки будут появляться на экране по мере записи в файл. Не очень удобно, тем что они «перемешиваются», но в один лог падает много, а в другой мало (например access и error логи, в error очень редко что-то попадает), то вполне приемлемо.
    • 0
      Или lnav (требует установки), но полноценная программа для парсинга логов.
    • 0
      а еще tail -f можно заменить на tailf — это отдельный бинарь, который умеет тоже самое.
      • 0
        проще прописать в .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'
        • 0
          если вы внимательно посмотрите на debian-подобные дистрибутивы последних как минимум 3-х лет, то вы увидите что этот бинарь УЖЕ есть в вашей системе.
          • +3

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

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

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

              • 0

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

                • 0
                  отвечу как владелец айфона, загнанный в угол: «а мне этот функционал и не нужен» =)
          • 0
            И вправду ) спасибо не заметил
  • +16
    Установить эту утилиту, если вы её у себя не найдёте, можно командой apt-get install multitail.

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

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

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

      • 0

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

    • +2

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

  • 0
    еще logtop хорошая штука
  • +1
    apt-get install pkg -y
    • +2
      Видимо yes и no более универсальна и позволяет отвечать на вопросы в командах, где нет параметров для «автоответов». На мой взгляд может быть удобно.
  • 0
    если когда-то набирал команду, но не очень помнишь детали или синтаксис (например как установить vpn соединение), то
    history | grep openconn
    • +5
      В bash можно Ctrl+R и начать набирать openconn — последняя подходящая команда из истории отобразится.
      • +1

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

      • 0
        А если установить hh — то по Ctrl+R еще круче штука запустится :)
        add-apt-repository ppa:ultradvorka/ppa
        apt-get update
        apt-get install hh
        
    • +4
      А почему не Ctrl+R?
    • +1
      лучше history | grep [o]penconn — и в результатах не будет этого последнего грепа.
  • +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 !".

    • 0

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

    • 0

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

  • +6

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


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

      truncate -s 10M out.txt
      


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

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

    • +1

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

      • +1

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


        column: –s:: No such file or directory
        • 0

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

        • +2
          Проблема не в пробеле, а в том, что хабр заменил символ чёрточки. Введите -s вручную и всё будет ок.
  • 0
    У меня на
    mount | column –t
    

    матерится:
    column: –t: Нет такого файла или каталога
    
    • +4
      хабр или браузер заменяют «обычный минус» на длинный. Наберите "-t" на клавиатуре, а не скопируйте — и все будет работать.
      • 0
        Спасибо.
        Вот что с людьми лень делает.
      • +1

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


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

    • 0

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

  • +1

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

  • +6
    Командой «git checkout -» можно переключаться туда-сюда между двумя последними ветками, как и в cd.
  • +1
    script ещё полезен для запуска screen внутри себя. Бывает так, что злобный тюремщик не оставляет тебе доступа даже к /dev/tty. screen без свободных tty запускаться не согласен — script может создать для него в юзерспейсе.
  • 0
    Узнал несколько новых полезных вещей, спасибо, вообще использую guake + tmux, неплохо получается работать с несколькими серверами, главное отдавать отчет где сейчас находишься)
    • 0
      это точно.
    • 0
      а у вас при создании новой вкладки в guake переименовываются все оставшиеся на дефолтные значения? ибо у меня именно так и происходит и это жутко бесит. хотя кроме guake я ничего не признаю больше)
      • 0

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

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

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

            • 0
              я пользовался terminator, мне он не очень понравился. Про второй эмулятор не слышал, обязательно посмотрю, спасибо. Правда его к сожалению нет в jessie.
  • +3
    cat urls.txt | xargs wget == wget -i urls.txt
    • 0
      cat urls.txt | wget -i -
      • 0
        wget -i urls.txt
        • 0
          cat urls.txt | ssh user@host 'wget -i -'
  • +1
    Вместо nohup ещё можно воспользоваться командой disown.
  • +1
    cat myfile | tr a-z A-Z > output.txt

    cat myfile | tr "[:lower:]" "[:upper:]" > output.txt
  • +2
    В каком случае apt update может понадобиться yes? Он же вроде вопросов не задает, другое дело apt install/remove.

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

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

    • 0

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

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

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

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

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


    while true

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


    while sleep 1

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

    • +1
      подобный пример без разъяснения ничего не стоит.
      • 0
        Успеете нажать Ctrl+C прежде чем вас выкинет из ssh сессии
  • 0

    С 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$ 
  • –2
    nohup wget site.com/file.zip

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

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

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


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

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

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


      mkcd() {
          if [ -z "$1" ]; then
              echo 'mkcd: Name expected'
              return 1
          fi
          mkdir -p "$1" && cd "$1"
      }
    • 0
      Точно так же работает +<.> при вводе с клавиатуры.
      • 0
        ESC + <.>, конечно же.
      • 0
        alt + <.> значительно удобнее, как и навигация типа alt + p, alt + b, alt + f
  • 0

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


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

    • +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с не доступен непривилегированному пользователю.

      • 0

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


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


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

        • +1
          то начнется DDOS

          DDOS начнется


          Не начнётся.
      • 0
        но ведь автор просто привел пример «полезной нагрузки» для используемой комбинации. в том то и соль что если вы не новичок, то вы просто оцениваете конструкцию и уж её применяете под свои задачи, используя другие команды вместо пинга и регулируя время между их запусками с помощью sleep.
      • 0
        И местами ощутимо лучше и приятнее scp (в смысле preserve атрибутов, если на второй стороне root.

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

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

    Создать эти каталоги можно одной командой:
    mkdir -p /var/lib/{project1,project2}/test
    
    • +4
      Немного короче:
      mkdir -p /var/lib/project{1..10}/test
      

      Ещё удобно переименовывать или копировать файлы в пределах одной директории.
      mv /long/path/to/file.txt{,.orig}
      
  • 0
    Пропинговать и получить ответ от всех хостов в сети.
    echo 192.168.1.{1..254}|xargs -n1 -P0 ping -c1|grep «bytes from»
    • +2

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

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

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


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

          • 0

            Иногда помогает заглянуть в 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:~$ 
            
  • 0
    Жесть, глазами Виндузятника бОльшая часть написанного здесь читается сложнее корейский иероглифов, тем не менее иногда сталкивался с различными проявлениями юникс систем на декстопных тачках, как то даже вторую систему дома ставил (не пошла, знаний не хватило освоить даже на уровне юниора).
    Но… прочел с удовольствием, проснулось желание повторить попытку знакомства. Пользуясь случаем поинтересуюсь у гуру данной платформы, с чего лучше начать почти новичку в данной области. Много читал про Debian, но тем не менее по обзорам и функционалу привлекает Arch Linux — не будет ли он слишком сложен в освоении? Какие еще варианты можете предложить?
    • 0

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

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

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


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


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


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

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

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

    • 0

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

    • 0

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

    • 0

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

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

      7 марта 2017 в 11:12


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

      гуру данной платформы, с чего лучше начать почти новичку
      • +2
        Уважаемый, где жирноту узрели?
  • 0
    Жаль нет кнопки сохранить
  • 0
    Вместо nohup можно использовать at now (или at на конкретное время)
    • 0

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

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

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

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

  • 0
    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

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


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

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

    alias please='sudo $(fc -ln -1)'
    
  • –1
    Как относитесь к обучению основ в игровом виде?
    Вчера нашел игрушку Hacknet
    рандомный скрин игрового интерфейса с просторов ынтерета
    image

    основанную на псевдо-взломах при помощи Терминала и набора команд (по заявлениям разработчиков — все команды рабочие и используются в реальной жизни для решения тех или иных задач)
    По крайней мере после нескольких тренеровочных заданий из комментов узнал команду «cat».
    Пока интересно.
    Может кто то сталкивался с этим проектом, стоит ли продолжать или не заниматься ерундой, так как ничего толкового там нет (хотя основы все таки какие то закладываются)?
    PS: пост не преследует целей прорекламировать что либо, крайне надеюсь что не нарушает (косвенно) правил ресурса и не вызовет агрессивной реакции участников сообщества.
    PSS: обход защиты реальных сетевых объектов преследуется по закону (странно как игрострой вообще пропустил проект, ну да ладно)
  • 0
    После выхода из сессии протокол будет записан в файл typescript.

    Макрософт уже в суд подавал?
  • 0
    а как послать в ребут после отработки команды. конкретно мне надо что бы после yum update -y комп перезагружался
    • +1
      А что мешает так и написать? yum upate -y && reboot
      Стандартный способ объединять последовательно несколько команд пока они успешно выполняются — через &&.
      Хотите продолжить цепочку даже в случае ошибки — замените && на ;.
  • 0
    Когда-то я не знал, как в фильмах так быстро набирают в консоли всякие хакерские слова.
    С помощью Tab-а дополнять набирающее стало намного проще.
    В чём отличие cd -. от cd…?
    • +1
      cd- «предидущая директория» — та в которой вы были ранее. cd… — подняться на папку выше.
      Пример:
      Вы были в /home/user/folder5/, потом попали в директорию к примеру — /usr/lib/. если наберёте команду cd- то сразу вернётесь из /usr/lib/ в /home/user/folder5/. В случае же если вы из /usr/lib/ наюерёте cd… то попадетё всего лишь в /usr/
      • 0
        Понято, спасибо.
  • +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
    
    


    При поиске мусора захлямляющего диск для меня это порой единственный весомый иснтрумент.
    • +3
      ncdu попробуйте
    • 0
      Ну и заодно du -sh * |sort -h, чтобы сразу отсортировать корректно
      Правда -h в sort'е появился относительно недавно.
      • 0
        Я бы использовал #du -sm, Он на большинстве версий *nix работает одинаково. Только HP-UX отличается. Зато даже на AIX показывает в мегабайтах.
  • +1
  • +5
    Еще очень удобная фишка, если нужно отредактировать/написать длинную команду, к примеру какой-то цикл. Последовательность Ctrl + x, Ctrl + e запустит редактор, установленный переменной окружения EDITOR, в котором уже изменить скрипт, а по закрытию он выполнится
    http://i.imgur.com/jmXmr3S.gifv
    • 0
      Спасибо, man bash до этого места я не дочитал ;)
  • +1
    Недавно делал себе небольшую шпаргалку по командам терминала.
  • +1
    Статья безусловно полезная.
    Но помню своё удивление, когда я впервые начал изучать командную строку *nix систем: нужно помнить много заклинаний. Нельзя просто логически найти или вывести по какой-то закономерности название нужной команды, нужно просто про неё знать. Было бы круто сделать какой-то автоподсказчик, где ты постепенно углубляясь по некоторой логической структуре, в итоге находишь нужную команду и получаешь основную информацию о том, как её использовать.
    man — это не то, т.к. это просто набор гипертекстовых документов, которые надо прочесть целиком в больших количествах, чтобы понять, что вообще происходит, а потом, опять же, помнить все заклинания наизусть. Что и я делал, когда изучал систему самостоятельно.
    • 0

      Чем гугл или stackoverflow не подсказчики?))) Есть задача — ищешь ответ, нужна структурированная информация — читаешь книги, такие статьи как эта — позволяют побольше узнать полезных команд, когда нету времени на более детальное изучение.
      Все что нужно — уже есть)

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

Самое читаемое Администрирование