Загрузка файла по ссылке с возможностью продолжить загрузку, например, при обрыве соединения:
wget -c http://link/file

Просмотр записи в текстовый файл в реальном времени:
tailf file

Узнать время выполнения команды:
time command

Слежение за изменениями в выводе команды:
watch command

Сочетание клавиш для закрытия текущей сессии в bash и различных утилитах, например клиент MySQL:
Ctrl-D

Быстрое создание резервной копии файла:
cp file{,.copy}

Очистка файла:
> file

Очистка файла при отсутствии прав на файл:
echo -n | sudo tee file

или
sudo truncate -s 0 file

Сочетание клавиш для поиска по истории введенных ранее команд:
Ctrl-R

Копирование файла с выводом прогресса:
pv sourcefile > destfile

Поиск по запущенным процессам без вывода самого процесса поиска:
ps aux | grep [p]rocess

Создание директории и всех вложенных директорий, если они отсутствуют:
mkdir -p /path/to/directory

Вывод всплывающих сообщений в Gnome и Debian-based системах:
notify-send "message!"

Работает аналогично команде cat, с тем отличием, что zcat предназначена для запакованных файлов.
zcat file

Рекурсивный поиск файлов, содержащих искомую строку:
grep -lr string /directory

Выводит список библиотек, необходимых для работы программы:
ldd file
Поделиться с друзьями
-->

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


  1. k12th
    05.04.2017 12:22
    +2

    При поиске по истории, повторное нажатие сtrl+r показывает предыдущий найденный результат.


  1. SyrexS
    05.04.2017 12:30

    tailf file

    или tail -f filename


    1. Morozov
      05.04.2017 13:17
      +3

      man tailf
      DESCRIPTION
      tailf is deprecated. It may have unfixed bugs and will be removed from util-linux in March 2017. Nowadays it's
      safe to use tail -f (from coreutils), in contrast to what the original documentation below says.


      1. varnav
        05.04.2017 13:19
        +1

        я думал это просто алиас tail -f


    1. varnav
      05.04.2017 13:18
      -2

      что дольше


      1. ZyXI
        05.04.2017 13:36

        Ненамного. И можете сами написать alias. По основным ключам tailf совместим с tail -f.


    1. kloppspb
      05.04.2017 14:24

      multitail. Особенно хорош в свете соседней темы, с вертикально развёрнутым монитором.


    1. trapwalker
      05.04.2017 15:40
      +4

      Для меня очень ценной оказалась эта команда в формате:

      tail -F filename1 filename2 filename3
      

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


    1. Alukardd
      06.04.2017 13:47

      А ещё лучше использовать less для этого, что бы не засирать окно эмулятора терминала.


  1. cynovg
    05.04.2017 12:40
    +1

    pv надо ставить отдельно. У ps есть замечательный ключ -C. И вообще, мне кажется что это — слишком.


    1. ZyXI
      05.04.2017 13:34

      Хотя я и сам использую ps -C, но в ряде систем (*BSD, Mac OS, cygwin) его, насколько я помню, нет. Но в любом случае нужно экранировать: '[p]rocess', а не [p]rocess, или вы рискуете получить process в итоге, а то и вовсе ошибку. И это знание абсолютно бесполезно: в скрипт в таком виде вставлять нельзя (может найти совершенно не то, что вы хотите: к примеру, Vim, в котором открыт исходный файл этого process), а если парсить своим мозгом, то отсеять лишний grep никаких проблем не составляет.


      1. cynovg
        05.04.2017 13:53

        В скриптах проще отслеживать процессы по PID-файлам, скорее всего (конечно же, зависит от задачи).


        1. ZyXI
          05.04.2017 14:08

          Не использовал PID?файлы, но часто использую что?то вроде waitemerge cmd: while ps -C emerge >/dev/null ; do sleep 1 ; done ; cmd: подождать пока команда (emerge — пакетный менеджер в Gentoo) завершится и запустить команду. PID?файлов самим emerge никаких не предусмотрено, определять PID emerge и использовать его неудобно (могут быть потомки с тем же именем, а так же я вполне могу запустить второй emerge для установки другого пакета, хотя обычно и не делаю) и потенциально некорректно (пока скрипт ждёт в sleep может создаться новый процесс с тем же PID; хотя это можно и проверить разными способами, дополнительные проверки не сделают результирующий скрипт короче и, соответственно, понятнее).


      1. Self_Perfection
        09.04.2017 12:44

        А ещё лучше освоить pgrep


  1. Ordinatus
    05.04.2017 12:41
    +8

    Вы как с цепи сорвались, писатели о bash на хабре.
    Делаете людям медвежью услугу, фрагментируя их знания.


  1. SyrexS
    05.04.2017 12:47
    +1

    А для команды

    echo -n | sudo tee file
    наверное понадобятся права sudo


    1. Aristarkh
      05.04.2017 14:29

      Я думаю, автор хотел сказать, что есть нет прав на редактирование файла file, но есть права sudo, то нельзя использовать команду

      sudo echo -n > file
      

      так как повышение привилегий будет действовать только на echo, но не на перенаправление вывода в файл. А для команды tee повысить привилегии с помощью sudo можно.


      1. kvaps
        08.04.2017 02:51

        deleted


  1. codrem
    05.04.2017 13:17
    +13

    Читаю мануалы — $50. Читаю мануалы с интонацией — $100 (с) древняя IRC шутка.


  1. acmnu
    05.04.2017 13:35

    Сочетание клавиш для закрытия текущей сессии в bash и различных утилитах, например клиент MySQL:
    Ctrl-D

    Это не так. Ctrl-D закрывает текущий поток. Фактически вы рубите STDIN для bash или MySQL или ещё для кого. И пока приложение не попытается прочитать из потока оно не узнает о том, что он закрыт. Получается, что приложение может вполне жить неопределенное время после ctrl-d. А эффект "закрытия" при таком негативном раскладе возникает из-за того, что терминал тоже реагирует на ctrl-d и обычно закрывается не дожидаясь реакции от процесса.


    Лет 10 назад, на моем первом месте работы за такое по руками били? ибо в некоторых Unix ksh не реагировал на обрыв STDIN.


    1. acmnu
      05.04.2017 13:39

      Ctrl-d активно используется в шеле для разных быстрых операций. Например так можно записать что-нибудь в файл прям из консоли с помощью cat. Просто набираем текст а потом жмем ctrl-d — он не оставит никаких следов в файле (да и в терминале).


      $ cat > /tmp/1.txt
      Hello, Habr!

      I intend to press ctrl+d
      $ cat /tmp/1.txt
      Hello, Habr!

      I intend to press ctrl+d
      $


    1. ZyXI
      05.04.2017 13:59

      Впервые слышу, чтобы терминал (эмулятор терминала) реагировал на <C-d> так. И у меня stdin не закрывается по <C-d>, только получается что?то вроде эмуляции «конца файла» (и то, если программа не отрубила эту возможность через stty или аналог) (активный или (если нет) следующий read(STDIN_FILENO) завершается без ошибки, немедленно, получая, то, что в буфере до <C-d>, если есть, но не получая ничего после <C-d> (но это получит следующий read)), а не закрытый stdin (т.е. следующий read(STDIN_FILENO) не отваливается с EBADF).


      1. acmnu
        05.04.2017 14:12

        Аааа. Т.е. я был не прав. Там EOF генерируется.


        1. ZyXI
          05.04.2017 23:41

          EOF умеет генерировать только stdio.h. Низкоуровневый ввод?вывод из unistd.h (это libc’шная обвязка системных вызовов) никаких EOF не знает: информация про то, как <C-d> обрабатывается здесь была получена экспериментированием с Python + posix.read (это Python’овская обвязка уже к libc’шным функциям): никаких EOF, вы что! В списке значений errno ничего нужного нет, а в байт EOF не запихнёшь: какое бы значение вы не выбрали, оно может реально появиться при чтении (и появится: те же картинки слабо отличимы от случайного шума).


          Кстати, я экспериментировал с Python (python -c 'import posix; print(repr(posix.read(0, 1))); print(repr(posix.read(0, 1)))', для некоторых проверок я вставлял sleep), потому что tcc -run - не «переваривает» код


          echo $'#include <unistd.h>\n#include <errno.h>\nint r(int fd, void *buf, size_t size){int ret=0;errno = 0;do{ret = read(fd, buf, size);}while(errno == EAGAIN);printf("e:%d\\n", errno);return ret;}\nmain() { char buf; printf("%d\\n", read(STDIN_FILENO, &buf, 1)); printf("b:%d\\n", buf); printf("%d\\n", read(STDIN_FILENO, &buf, 1)); printf("b:%d", buf); }' | tcc -run -

          Точнее, код он переваривает, но stdin всё ещё соединён с echo, а не с терминалом, а я этого как?то не сообразил. Мои слова можно им проверить, если его скомпилировать и запустить отдельно (или использовать tcc -run <(echo …)).


          1. acmnu
            10.04.2017 15:25

            Тогда я не понимаю: stdin не обрывается, eof нет. Получается хендлинг ctrl-d встроен куда-то в libc?


            1. ZyXI
              10.04.2017 16:11

              Да. К, примеру, uclibc: https://git.uclibc.org/uClibc/tree/libc/stdio/_READ.c?id=ca1c74d67dd115d059a875150e10b8560a9c35a8#n46. Glibc не спрашивайте, там в исходниках ужас из кучи уровней абстракции: после fread вы ищете _IO_fread, оттуда __IO_sgetn, оттуда _IO_XSGETN, там какой?то __xsgetn (ссылка на функцию внутри структуры) на котором мне искать надоело.


              По коду: read() получает 0 байт — значит, EOF.


  1. imrobot2002
    05.04.2017 14:11

    Вот ещё хороший ресурс для тех, кто изучает шелл — вставляешь команду и получаешь подробное объяснение: https://explainshell.com/


  1. ROR191505
    05.04.2017 14:29

    "tailf" вроде как давно deprecated и вместо него нужно использовать "tail -f".


    1. JIghtuse
      07.04.2017 20:25

      Именно так. Собственно, в следующем релизе util-linux tailf уже не будет.


  1. Rulur
    05.04.2017 14:29
    +1

    Забавно, я вместо tailf file всегда использовал tail -f file. Результат тот же.


  1. demfloro
    05.04.2017 14:29
    +1

    Выводит список библиотек, необходимых для работы программы:
    ldd file

    ldd на небезопасных исполняемых файлах может исполнить произвольный код злоумышленника. Безопасной альтернативой является


    objdump -p ./program | grep NEEDED

    Источник


  1. pewpew
    05.04.2017 15:27

    Если текст вставляется не из того буфера, попробуйте Ctrl+Shift+Ins
    Это сочетание вставляет текст из основного буфера. Мне это знание как-то раз сильно помогло перестать мучится.


  1. ghostinushanka
    05.04.2017 15:30
    +20

    Охрфигеть статья. Я себе в жизни не позволю написать такую бесполезную заметку (бесполезную — в сравнении с уровнем который я сам ожидаю на хабре), а тут человека за то, что я от юниоров требую, приглашают на хабр.
    Что-то там говорилось про «хабр уже не торт»?

    P.S. Я в курсе, что я нарываюсь своим комментарием на кучу минусов, но простите господа, это уже ни в какие ворота не лезет.


  1. Chiron
    05.04.2017 17:25
    +7

    ИМХО. Уровень «Статьи» явно не тянет на инвайт…