По мотивам
дискуссии на слэшдоте. Всякие полезные, занятные и совсем бесполезные мелочи, позволяющие сделать работу в коммандной строке удобнее и приятнее. Кое-что добавил уже от себя. Многим это, конечно, и так известно, но коллективный опыт всегда больше. Я для себя кое-что почерпнул.
- Началось с упоминания о
write
, которая позволяет слать сообщения другим пользователям системы.$ w
…
sergey pts/1 :0.0 11:34 3.00s 0.18s 0.18s bash
$ write sergey pts/1
hi there!
^D
Хотя, если права позволяют, можно просто писать$ echo '^LAll files deleted.' > /dev/pts/1
TAB-TAB-TAB
:-)
- Не обошлось без шуток. Мне понравился «коан»:
$ grep '' /dev/null
И «про уток»:$ du -cks
- А
screen
позволяет подключаться и отключаться к виртуальному терминалу, который работает даже если выйти из системы, имеет кучу применений, от запуска «долгоиграющих» процессов на удалённых машинах до экстремального программирования; также очень полезен для создания «общего» терминала (screen -x
), можно видеть, что делает другой человек, или показывать ему то, что делаешь. На удалённой машине обычно запускаю так: $ screen -RD
Список виртуальных терминалов: ^Aw
. Выбор терминала: ^Aцифра
. Отсоединися от screen
-а (не закрывая его терминалы): ^Ad
cd -
, чтобы вернуться в предыдущий каталог (до cd
) и cd `pwd -P`
, чтобы перейти по настоящему пути (если пришёл по символической ссылке). Ещё полезны pushd
и popd
(запомнить текущий каталог и потом в него вернуться).
history | grep шаблон
, чтобы вспомнить, что уже делал. ^Rфрагмент-команды^R^R^R…
, чтобы найти и повторить ранее выполненную команду. ^N
и ^P
чтобы прокручивать историю bash
вперёд и назад.
- Чтобы повторить последнюю команду:
$ !!
И при редактировании команды — ESC.
, чтобы подставить последний аргумент последней команды. В эту же категорию попадает ещё целая пачка трюков (man bash
, /^HISTORY EXPANSION
).
- Если в режиме поиска команды нажать
^O
, то будет исполнена текущая команда из истории и после этого будет набрана следующая команда из истории. Можно автоматизировать весь цикл редактирование-компиляция-исполнение. Проще объяснить на примере:$ vi foo.c
$ gcc -o foo{,.c}
$ ./foo
$ ^Rvi^O^O^O^O^O…
- Для любителей
vi
можно переключить сочетания клавиш$ set -o vi
после этого ESC чтобы перейти в коммандный режим и режима вставки, k
/j
, чтобы прокручивать историю команд, /шаблонENTER
, и n
/N
, чтобы искать по истории. Если честно, хотя и и пользуюсь постоянно vim
, в bash
по-умолчанию всё равно Emacs-овские сочетания…
META-t
в bash
, чтобы поменять местами аргументы.
^S
и ^Q
, чтобы приостановить и продолжить вывод в терминал («пауза»).
reset
обычно приходится набирать вслепую (после неудачного вывода бинарного файла в stdout). Чаще достаточно ^L
.
ssh
и много-много-много его применений. -XC
для запуска иксовых приложений на удалённой машине с локальным X-сервером. -D
, -L
и -R
для создания защищённых тунелей. Требует отдельного обсуждения.
sftp
, имитация FTP-клиента поверх SSH, и sshfs
для подключения удалённой файловой системы поверх SSH (я бы добавил сюда scp
и rsync
).
wc -l
, чтобы подсчитать количество строк. nl
, чтобы добавить номера строк.
sort
для сортировки строк. sort -n
— числовая сортировка.
… | rev | sort | rev
, чтобы сгруппировать строки по окончаниям.
du -sh * | sort -n
неплохая замена графическому baobab
(точнее наоборот).
head -количествострок
и tail -количествострок
для печати начала и конца файла, tail -f
, чтобы следить за файлом, который ещё пишется (например, лог). Полезный вариант: tail -F возможно-несуществующий-файл
.
strings
, чтобы увидеть человеко-читаемые строки, встречающиеся в файле. См. пример в предыдущем посте.
grep
, чтобы отобрать только нужные строчки, … | grep шаблон
. Мне часто полезны опции -r
(рекурсивно во вложенных подкаталогах) и -i
(без учёта регистра). Да, grep
поддерживает также опцию --color
(нагляднее).
awk
для того, чтобы разбить строчку на поля и вытащить только нужные. … | awk -F'разделитель' '{print $номер-поля;}'
$ echo "a,b,c" | awk -F',' '{print $2;}'
В простых случая можно использовать cut -d 'разделитель' -f список-полей
: $ echo 'a,b,c' | cut -d ',' -f 2
- Обратные апострофы (
`команда`
или $(команда)
) подставляют результат выполнения команды.$ NOW=$(date -u)
…
$ echo $NOW
Птн Ноя 7 12:17:07 UTC 2008
- Выполение задания в назначенное время (один раз):
$ echo 'команда' | at время
Говорящий будильник:$ echo 'for i in `seq 1 10`; do echo wake up, internet was updated | festival --tts ; done;' | at 08:00
Такой вот одноразовый cron
.
find
очень стоит того, чтобы научиться ей пользоваться. Особенно полезна опция -exec команда, в которой {} заменяет имя найденного файла \;
. Для меня стало открытием, что -exec
можно использовать также в качестве условия для выбора файлов:$ find . -exec grep -q 'шаблон' {} \; -print
echo *
вместо ls
. ls -v
для «правильной» сортировки пронумерованных файлов (12.txt после 2.txt). ls -tgo
покажет недавно изменённые файлы первыми.
- Мне очень нравятся фигурные скобки в
bash
. Так можно писать:$ gcc -o foo{,.c}
$ convert /длинный/путь/к/image.{eps,jpg}
вместо$ gcc -o foo foo.c
$ convert /длинный/путь/к/image.eps /длинный/путь/к/image.jpg
- Управление процессами:
^Z
, bg
, fg
, jobs
, kill %номерзадачи
. И тогда ps
нужен гораздо реже. А htop
, кстати, удобнее, чем просто top
.
- Раскрытие переменных в
bash
: ${var%ending-to-remove}newending
, ${var/find/replace}
, ${var//find/replace-all}
, ${var#prefix-to-remove}
.
- Циклы в
bash
: for f in * ; do команды ; done
чтобы обработать все файлы (*
), for i in `seq 1 10` ; do команды ; done
чтобы перебрать все i
от 1 до 10. В скриптах удобно использовать неявные циклы вида while [ $# -gt 0 ] ; do arg=$1; shift; … ; done
.
- Широко известно про
dd
для создания образов дисков, их бэкапа и восстановления. # dd if=/dev/раздел of=/media/backup/образ-раздела bs=1k conv=noerror,sync
Менее известный приём: killall -USR1 dd
, чтобы увидеть, сколько уже сделано.
lsof /media/том
, чтобы узнать, какой процесс использует файлы на нежелающем отсоединяться диске. Может пригодится и для решения проблем с файлами устройств (/dev/что-нибудь
).
Другой вариант — fuser -v /media/том
. Тоже очень удобно.
eject
, чтобы выдвинуть подставку для кофе.
cal 11 2008
и мы вспоминаем, что сегодня пятница. date
и узнаём, который час.
- Из всевозможных «калькуляторов» под рукой почти всегда будет вот этот:
$ awk 'BEGIN{ print exp(1)+2^(1.0/3); }'
Ещё традиционный вариант для интерактивного использования — bc -l
. В нём, правда, нестандартные названия функций: s(x)
— синус, c(x)
— косинус, a(x)
— арктангенс, l(x)
— натуральный логарифм, e(x)
— экспонента, x^n
— целая степень. Предыдущее выражение можно посчитать так:$ bc -l
...
e(1)+e((1/3)*l(2))
3.97820287835391840011
А целые числа умеет складывать и bash
: echo $((2+2))
.
time команда
чтобы засечь время выполнения задачи.
ulimit -m размер-памяти-в-килобайтах
ограничить максимальный размер памяти процессов, вызываемых из текущей оболочки. Вариант: -v размер-памяти-в-килобайтах
для ограничения размера виртуальной памяти. Полезно, если есть опасения, что процесс слишком жадный.
nice -n +10 команда
выполнить команду с пониженным на 10 приоритетом. Полезно, если команда работает долго, требует много процессорного времени, а оно нужно и для другого.
- Доб. 2008-11-26: чтобы после поиска по истории вернуться к последним коммандам,
ESC >
.
Дополнения можно писать в комментариях.
Доб. 2009-09-29:
cut
,
bc -l
и
fuser
.