Комментарии 34
При поиске по истории, повторное нажатие сtrl+r показывает предыдущий найденный результат.
tailf file
или tail -f filename
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.
tail -F filename1 filename2 filename3
Во-первых, ключ F позволяет перезахватывать файл, если он был удален и пересоздан с тем же именем. Это удобно, когда настроена ротация логов и файл время от времени переименовывается и пересоздаётся.
Во-вторых, этой команде можно дать несколько файлов и они будут смешиваться абзацами. Это тоже удобно для мониторинга в одном терминале сразу нескольких логов или для смешивания их в один файл.
Хотя я и сам использую ps -C
, но в ряде систем (*BSD, Mac OS, cygwin) его, насколько я помню, нет. Но в любом случае нужно экранировать: '[p]rocess'
, а не [p]rocess
, или вы рискуете получить process
в итоге, а то и вовсе ошибку. И это знание абсолютно бесполезно: в скрипт в таком виде вставлять нельзя (может найти совершенно не то, что вы хотите: к примеру, Vim, в котором открыт исходный файл этого process), а если парсить своим мозгом, то отсеять лишний grep никаких проблем не составляет.
Не использовал PID‐файлы, но часто использую что‐то вроде waitemerge cmd
: while ps -C emerge >/dev/null ; do sleep 1 ; done ; cmd
: подождать пока команда (emerge — пакетный менеджер в Gentoo) завершится и запустить команду. PID‐файлов самим emerge никаких не предусмотрено, определять PID emerge и использовать его неудобно (могут быть потомки с тем же именем, а так же я вполне могу запустить второй emerge для установки другого пакета, хотя обычно и не делаю) и потенциально некорректно (пока скрипт ждёт в sleep может создаться новый процесс с тем же PID; хотя это можно и проверить разными способами, дополнительные проверки не сделают результирующий скрипт короче и, соответственно, понятнее).
Делаете людям медвежью услугу, фрагментируя их знания.
echo -n | sudo tee fileнаверное понадобятся права sudo
sudo echo -n > file
так как повышение привилегий будет действовать только на echo, но не на перенаправление вывода в файл. А для команды tee повысить привилегии с помощью sudo можно.
Сочетание клавиш для закрытия текущей сессии в bash и различных утилитах, например клиент MySQL:
Ctrl-D
Это не так. Ctrl-D закрывает текущий поток. Фактически вы рубите STDIN для bash или MySQL или ещё для кого. И пока приложение не попытается прочитать из потока оно не узнает о том, что он закрыт. Получается, что приложение может вполне жить неопределенное время после ctrl-d. А эффект "закрытия" при таком негативном раскладе возникает из-за того, что терминал тоже реагирует на ctrl-d и обычно закрывается не дожидаясь реакции от процесса.
Лет 10 назад, на моем первом месте работы за такое по руками били? ибо в некоторых Unix ksh не реагировал на обрыв STDIN.
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
$
Впервые слышу, чтобы терминал (эмулятор терминала) реагировал на <C-d>
так. И у меня stdin
не закрывается по <C-d>
, только получается что‐то вроде эмуляции «конца файла» (и то, если программа не отрубила эту возможность через stty или аналог) (активный или (если нет) следующий read(STDIN_FILENO) завершается без ошибки, немедленно, получая, то, что в буфере до <C-d>
, если есть, но не получая ничего после <C-d>
(но это получит следующий read)), а не закрытый stdin (т.е. следующий read(STDIN_FILENO) не отваливается с EBADF).
Аааа. Т.е. я был не прав. Там EOF генерируется.
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 …)
).
Тогда я не понимаю: stdin не обрывается, eof нет. Получается хендлинг ctrl-d встроен куда-то в libc?
Да. К, примеру, 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.
"tailf
" вроде как давно deprecated и вместо него нужно использовать "tail -f
".
Именно так. Собственно, в следующем релизе util-linux tailf уже не будет.
Это сочетание вставляет текст из основного буфера. Мне это знание как-то раз сильно помогло перестать мучится.
Что-то там говорилось про «хабр уже не торт»?
P.S. Я в курсе, что я нарываюсь своим комментарием на кучу минусов, но простите господа, это уже ни в какие ворота не лезет.
Несколько полезных команд для работающих в терминале Linux