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)
SyrexS
05.04.2017 12:30tailf file
или tail -f filenameMorozov
05.04.2017 13:17+3man 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.
trapwalker
05.04.2017 15:40+4Для меня очень ценной оказалась эта команда в формате:
tail -F filename1 filename2 filename3
Во-первых, ключ F позволяет перезахватывать файл, если он был удален и пересоздан с тем же именем. Это удобно, когда настроена ротация логов и файл время от времени переименовывается и пересоздаётся.
Во-вторых, этой команде можно дать несколько файлов и они будут смешиваться абзацами. Это тоже удобно для мониторинга в одном терминале сразу нескольких логов или для смешивания их в один файл.
Alukardd
06.04.2017 13:47А ещё лучше использовать less для этого, что бы не засирать окно эмулятора терминала.
cynovg
05.04.2017 12:40+1pv надо ставить отдельно. У ps есть замечательный ключ -C. И вообще, мне кажется что это — слишком.
ZyXI
05.04.2017 13:34Хотя я и сам использую
ps -C
, но в ряде систем (*BSD, Mac OS, cygwin) его, насколько я помню, нет. Но в любом случае нужно экранировать:'[p]rocess'
, а не[p]rocess
, или вы рискуете получитьprocess
в итоге, а то и вовсе ошибку. И это знание абсолютно бесполезно: в скрипт в таком виде вставлять нельзя (может найти совершенно не то, что вы хотите: к примеру, Vim, в котором открыт исходный файл этого process), а если парсить своим мозгом, то отсеять лишний grep никаких проблем не составляет.cynovg
05.04.2017 13:53В скриптах проще отслеживать процессы по PID-файлам, скорее всего (конечно же, зависит от задачи).
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; хотя это можно и проверить разными способами, дополнительные проверки не сделают результирующий скрипт короче и, соответственно, понятнее).
Ordinatus
05.04.2017 12:41+8Вы как с цепи сорвались, писатели о bash на хабре.
Делаете людям медвежью услугу, фрагментируя их знания.
SyrexS
05.04.2017 12:47+1А для команды
echo -n | sudo tee file
наверное понадобятся права sudoAristarkh
05.04.2017 14:29Я думаю, автор хотел сказать, что есть нет прав на редактирование файла file, но есть права sudo, то нельзя использовать команду
sudo echo -n > file
так как повышение привилегий будет действовать только на echo, но не на перенаправление вывода в файл. А для команды tee повысить привилегии с помощью sudo можно.
codrem
05.04.2017 13:17+13Читаю мануалы — $50. Читаю мануалы с интонацией — $100 (с) древняя IRC шутка.
acmnu
05.04.2017 13:35Сочетание клавиш для закрытия текущей сессии в bash и различных утилитах, например клиент MySQL:
Ctrl-DЭто не так. Ctrl-D закрывает текущий поток. Фактически вы рубите STDIN для bash или MySQL или ещё для кого. И пока приложение не попытается прочитать из потока оно не узнает о том, что он закрыт. Получается, что приложение может вполне жить неопределенное время после ctrl-d. А эффект "закрытия" при таком негативном раскладе возникает из-за того, что терминал тоже реагирует на ctrl-d и обычно закрывается не дожидаясь реакции от процесса.
Лет 10 назад, на моем первом месте работы за такое по руками били? ибо в некоторых Unix ksh не реагировал на обрыв STDIN.
acmnu
05.04.2017 13:39Ctrl-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
$
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).acmnu
05.04.2017 14:12Аааа. Т.е. я был не прав. Там EOF генерируется.
ZyXI
05.04.2017 23:41EOF умеет генерировать только 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 …)
).acmnu
10.04.2017 15:25Тогда я не понимаю: stdin не обрывается, eof нет. Получается хендлинг ctrl-d встроен куда-то в libc?
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.
imrobot2002
05.04.2017 14:11Вот ещё хороший ресурс для тех, кто изучает шелл — вставляешь команду и получаешь подробное объяснение: https://explainshell.com/
ROR191505
05.04.2017 14:29"
tailf
" вроде как давно deprecated и вместо него нужно использовать "tail -f
".
Rulur
05.04.2017 14:29+1Забавно, я вместо tailf file всегда использовал tail -f file. Результат тот же.
pewpew
05.04.2017 15:27Если текст вставляется не из того буфера, попробуйте Ctrl+Shift+Ins
Это сочетание вставляет текст из основного буфера. Мне это знание как-то раз сильно помогло перестать мучится.
ghostinushanka
05.04.2017 15:30+20О
хрфигеть статья. Я себе в жизни не позволю написать такую бесполезную заметку (бесполезную — в сравнении с уровнем который я сам ожидаю на хабре), а тут человека за то, что я от юниоров требую, приглашают на хабр.
Что-то там говорилось про «хабр уже не торт»?
P.S. Я в курсе, что я нарываюсь своим комментарием на кучу минусов, но простите господа, это уже ни в какие ворота не лезет.
k12th
При поиске по истории, повторное нажатие сtrl+r показывает предыдущий найденный результат.