Pull to refresh

Comments 34

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

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.
я думал это просто алиас tail -f

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

UFO just landed and posted this here
Для меня очень ценной оказалась эта команда в формате:
tail -F filename1 filename2 filename3

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

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

UFO just landed and posted this here

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

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

так как повышение привилегий будет действовать только на echo, но не на перенаправление вывода в файл. А для команды tee повысить привилегии с помощью sudo можно.
Читаю мануалы — $50. Читаю мануалы с интонацией — $100 (с) древняя IRC шутка.
Сочетание клавиш для закрытия текущей сессии в 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.

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

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

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

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


objdump -p ./program | grep NEEDED

Источник

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

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

Articles