Несколько полезных команд для работающих в терминале Linux

Загрузка файла по ссылке с возможностью продолжить загрузку, например, при обрыве соединения:
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
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 34

    +2

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

      0
      tailf file

      или tail -f filename
        +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
          я думал это просто алиас tail -f
          –2
          что дольше
            0

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

            0
            multitail. Особенно хорош в свете соседней темы, с вертикально развёрнутым монитором.
              +4
              Для меня очень ценной оказалась эта команда в формате:
              tail -F filename1 filename2 filename3
              

              Во-первых, ключ F позволяет перезахватывать файл, если он был удален и пересоздан с тем же именем. Это удобно, когда настроена ротация логов и файл время от времени переименовывается и пересоздаётся.
              Во-вторых, этой команде можно дать несколько файлов и они будут смешиваться абзацами. Это тоже удобно для мониторинга в одном терминале сразу нескольких логов или для смешивания их в один файл.
                0
                А ещё лучше использовать less для этого, что бы не засирать окно эмулятора терминала.
              • UFO just landed and posted this here
                  0

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

                  • UFO just landed and posted this here
                      0

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

                      0
                      А ещё лучше освоить pgrep
                    +8
                    Вы как с цепи сорвались, писатели о bash на хабре.
                    Делаете людям медвежью услугу, фрагментируя их знания.
                      +1
                      А для команды
                      echo -n | sudo tee file
                      наверное понадобятся права sudo
                        0
                        Я думаю, автор хотел сказать, что есть нет прав на редактирование файла file, но есть права sudo, то нельзя использовать команду
                        sudo echo -n > file
                        

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

                          deleted

                        +13
                        Читаю мануалы — $50. Читаю мануалы с интонацией — $100 (с) древняя IRC шутка.
                          0
                          Сочетание клавиш для закрытия текущей сессии в bash и различных утилитах, например клиент MySQL:
                          Ctrl-D

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


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

                            0

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

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

                                0

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

                                  0

                                  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 …)).

                                    0

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

                                      0

                                      Да. К, примеру, 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.

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

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

                                +1
                                Забавно, я вместо tailf file всегда использовал tail -f file. Результат тот же.
                                  +1
                                  Выводит список библиотек, необходимых для работы программы:
                                  ldd file

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


                                  objdump -p ./program | grep NEEDED

                                  Источник

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

                                      P.S. Я в курсе, что я нарываюсь своим комментарием на кучу минусов, но простите господа, это уже ни в какие ворота не лезет.
                                        +7
                                        ИМХО. Уровень «Статьи» явно не тянет на инвайт…

                                        Only users with full accounts can post comments. Log in, please.