Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
cd production development. Другими словами, с двумя параметрами cd работает как replace.[user@comp /]$ /home/user/projects
bash: /home/user/projects: Is a directory
[user@comp /]$ cd !!
cd /home/user/projects
[user@comp projects]$
$ ls -al /path/to/directory$ cd <ESC> <.> # преобразуется в cd /path/to/directoryhumbug@pc ~ $ pushd /usr/
/usr ~
humbug@pc /usr $ popd
~
humbug@pc ~ $
cd - знают не все.sudo !! — это же не отдельная команда! Это комбинация общеизвестного sudo — и символа повтора предыдущей команды !!. Малоизвестным является именно второй — но он не является командой.man — не малоизвестная команда, ее вы найдете в любом учебнике Unix'а, однако я бы хотел обратить ваше внимание на некоторые ее особенности.
!! есть и другие, не менее полезные, команды для работы с историейhistory а потом !номер_комманды_в_истории. Удобно искать иногда через history | grepzcat /usr/share/man/man1/man.1.gz | nroff -man | lessgit log Alt+h file).less /usr/share/man/ru.UTF-8/man1/rview.1.xz показывает читаемую страницу. Зависит от каких‐то настроек (которые в Gentoo по‐умолчанию, а где‐то ещё нет) и является одной из причин, по которой я практически никогда не использую less filename (вторая — suffix alias cat file L удобнее, если вы хотите заменить L на что‐то ещё).ximaera@endeavour:50:~#515$ LC_ALL=C PAGER=less man man | col | grep -A2 -- --pager=
-P pager, --pager=pager
Specify which output pager to use. By default, man uses pager -s. This option overrides the $MANPAGER environment variable, which in turn overrides the $PAGER environment variable. It is not used in conjunction with
-f or -k.
ximaera@endeavour:50:~#516$ export MANPAGER="/bin/sh -c \"unset MANPAGER;col -b -x | \
view -R \
-c 'set ft=man nomod nolist' \
-c 'set nonumber' \
-c 'map q :q<CR>' \
-c 'map <SPACE> <C-F>' -c 'map b <C-U>' \
-c 'nmap K :Man <C-R>=expand(\\\"<cword>\\\")<CR><CR>' -\""mva ~ whoami # Enter
mva
mva ~ sudo!!! # Enter
mva ~ sudo whoami # (т.е. сначала подставилось для проверки)
root
mva ~ echo $0 # :)
zsh
$ rm -rf /$ sudo !! <RETURN>$ sudo rm -rf /
vim /usr/local/etc/nginx/nging.conf # Decided to make a backupcp Alt+. Alt+..backups1:~$ echo a
a
s1:~$ echo $_
a
$_ я уже упомянул. А ещё раньше — ivanko (http://habrahabr.ru/post/228999/#comment_7756763). Повторю здесь: с !$ и <A-.> в истории сохранится тот аргумент, с которым вы запустили команду. С $_ в истории сохранится $_. Иногда это именно то, что вы хотите, иногда нет.когда нет установленного killallИ так тоже бывает?.. Черт, это же хуже, чем когда в «семерке» телнета не стало!
память
yes | <команда, запрашивающая ввод yes>
git commit -m 'Initial commit' # Here we remembered that we didn't add files to stagingCtrl+ugit add .Ctrl+y # Now we have our git commit message again.<C-o> из Vim (<C-o> запускает одну команду нормального режима из режима вставки, и потом возвращается в режим вставки) (собственно, и написал). Причём бо́льшая часть работы переложена на уже имеющуюся раскладку vicmd. Здесь есть подсветка синтаксиса (жаль только что не встроенная — встроен только API для подсветки регионов), возможность переопределить всё и вся (один человек ради интереса написал аналог ipython как надстройку над zsh: github.com/Valodim/zsh-python-mode (перед тем как жаловаться, прочтите README)), множество раскладок (по‐умолчанию обычные три и как минимум одна специальная: viins и vicmd для поддержки vi режима, emacs для соответствующего режима и специальная isearch, используемая для <C-r>).arth@arth:~$ lq /
lq: команда не найдена
arth@arth:~$ ^lq^ls
ls /
bin dev home ...
arth@arth:~$ mount | column -t
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
...
$ echo abc | rev
cba
$
jot
for i in `seq 10`; do echo $i; done$ seq start [[step] finish] $ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
for a in {01..10}; do echo $a; done$ for a in {01..100}; do echo $a; done
01 02 …, а не 001 002 …. Не думаю, что такое поведение некорректно: в вашем случае вы лишаетесь возможности генерировать именно то, что генерирует zsh (я несколько раз видел номера серий в стиле 01 02 … 99 100 101 …).${(l:2::0:)a} и typeset -i -Z2 a.$#max и вообще любое выражение, не содержащее разделители (в примере у меня и в документации — двоеточие, но разделители могут и не быть двоеточиями). Второе объявит, что, во‐первых, данная переменная является целочисленной, а, во‐вторых, что при подстановке её следует дополнять нулями до данной ширины.typeset дополнять можно только нулями или пробелами, с ${(l)} вы можете дополнять чем угодно, включая нулевые байты (используйте формат ${(pl:2::\0:)VAR} — обратить внимание на p).cat /etc/samba/smb.confvim [ESC] + . — bash сам подставит аргумент.set completion-ignore-case Onvim +78 file в файле /etc/inputrc дописываем следующее
**/*.h, find|xargs (новую строку в имени файла в «диком виде» я видел ровно один раз и то только потому, что konqueror позволил мне её туда закопипастить — во всех остальных случаях она помещалась туда намеренно с целью тестирования) или что‐нибудь ещё, но никак не $(find). $(что‐то ещё) я использую, но только когда точно знаю, что это «что‐то ещё» выведет.{}. () ценна тем, что создаёт новый shell, соответственно окружение (текущий каталог, переменные окружения, ограничения на потребления ресурсов (ulimit)) не изменится, что бы вы там не делали. {} новый shell не создаёт. Конкретно в вашем примере из‐за cd нужен новый shell, а не группировка.import): во‐первых, в моём fluxbox для его использования созданы клавиатурные сочетания, во‐вторых, ImageMagick присутствует на многих системах, что значит, что если он там, то мне не придётся думать, как сделать скриншот здесь. import умеет брать скриншоты всего экрана (указанного в командной строке или тыкнутого мышкой), конкретного окна или даже области, которую вы выделяете мышкой и сохранять сразу в запрошенном формате.It is similar to tail -f but does not access the file when it is not growing. This has the side effect of not updating the access time for the file, so a filesystem flush does not occur periodically when no log activity is happening.
tailf is extremely useful for monitoring log files on a laptop when logging is infrequent and the user desires that the hard disk spin down to conserve battery life.
<C-p>/<C-n>, а не стрелочки. До стрелочек долго тянуться. А <C-r> незаменим в сложных случаях (я помню, что что‐то такое писал, но что именно — вопрос).tcsh(1), который шелл по умолчанию во FreeBSD. Въедливая привычка, быстро подсаживаешься. :-)tcsh(1) как раз просто перебирают команды (без учета первых символов). Про сложные случаи и ^R согласен.<C-n>/<C-p> по‐умолчанию не производят поиск команды. У меня и в tcsh ни стрелочки, ни <C-n>/<C-p> не учитывают первые символы, в zsh по‐умолчанию так же, то же и в bash — нигде и ни стрелочки, ни <C-n>/<C-p>.zsh -f и tcsh -f. Для bash уберите ~/.inputrc. Возможно вам придётся явно указать zsh, что вы хотите раскладку emacs («If one of the VISUAL or EDITOR environment variables contain the string `vi' when the shell starts up then it will be `viins', otherwise it will be `emacs'»). Вполне возможно, что вы используете умолчания FreeBSD (системный файл настроек), а не tcsh.$ /usr/bin/time -f %M ls
852
$ \time -f %e ls -R /
...
Command exited with non-zero status 2
3.09
$
$ ll
итого 36
drwxr-xr-x 2 yukra yukra 4096 июля 7 21:46 .
drwx------ 87 yukra yukra 28672 июля 7 16:43 ..
$ \ll
ll: команда не найдена
$ if
Ctrl+C
> ^C
$ \if
if: команда не найдена
$
\ll спокойно выполнит функцию оболочки с именем ll или алиас \\ll (которого, скорее всего, нет). Это просто хак для парсера, основывающийся на том, что shell сначала заменяет alias’ы, а потом уже производит различные подстановки. В man zshmisc прямо указано, почему \ll работает («Alias expansion is done on the shell input before any other expansion except history expansion. Therefore…»).\echo — это не /bin/echo, а echo, встроенная в оболочку.\ll не отменит исполнения функции, определённой в переменной окружения (зато bash не даст определить alias \\ll). Если речь идёт про zsh, то не отменит исполнения command_not_found_handler (при желании можно использовать для того же, только с меньшим приоритетом — с command_not_found_handler, выполняющего функции из переменных окружения (смотреть export -f в bash), вы не переопределите sudo).command: command echo 'Not a built-in echo'.yukra@yukra-ThinkPad ~ $ cd /
yukra@yukra-ThinkPad / $ \cd
yukra@yukra-ThinkPad ~ $ which cd
yukra@yukra-ThinkPad ~ $
\if не работает, потому что if — это «reserved word» (и по‐особому обрабатывается парсером), а cd — это «shell builtin» и особая обработка (которой вы мешаете своим слэшем) не нужна. Для определения что есть что используйте type, а не which.echo $MANPAGERalias dirsize="du -hd 0" #Измеряет размер директории, в которой находитесь
alias contsize="du -hd 1" #Измеряет размер всех директорий в директории, в которой находитесь
alias cd..="cd .." #Не могу искоренить эту привычку, постоянно набираю cd.. =)
alias man="man -a" #Показывает ВСЕ мануалы по названию, попробуйте, к примеру, man -a signal, узнаете, что в Линуксе есть документация по сигналам, которые можно посылать программам
alias dhclient="dhclient -v" #Делает вывод dhclient намного информативнее - показывает запросы и ответы сервера, если есть. Короче, ждать получения IP-адреса уже не так скучно =)
alias toinstall="aptitude --schedule-only install" #Маркирует указанный пакет как помеченный к установке, удобно, когда система обновляется, а ты внезапно нашёл клёвую программу и хочешь не забыть её установить.
alias remove="aptitude --schedule-only remove" #То же самое, только скорее к случаю, когда ты внезапно нашёл в своей системе клёвую программу и хочешь её удалить
#Использование - toinstall sysvinit / toremove systemd, ну или наоборот =)
#Применяется, когда в следующий раз запустите aptitude install без указания пакета - просто "aptitude install".
alias watch="watch -n 1" #Обновление watch раз в 1 секунду, а не 2.
alias wpc="watch usr/local/bin/watch.sh" # Скриптик, в котором выводится acpi, date, ifconfig... короче, всё, что бы хотелось держать в отдельной консоли, постоянно обновлять и иметь возможность в любую минуту посмотреть =)
Внимание, единственный способ остановить ее — CTRL + C
Внимание, единственный способ остановить ее
Внимание
CTRL + C
du -hs. Я обычно именно так и набираю.du -sh" гармоничнее звучит/выглядит-s на --max-depth=1 (почему‐то -s я легко запомнил, а -d — нет).checkinstall — сборка из исходников в Debian-пакет
man -P 'less -p "-P pager,"' manset editing-mode vi
$if mode=vi
set keymap vi-command
# # these are for vi-command mode
"\e[A": history-search-backward # arrow up
"\e[B": history-search-forward # arrow down
"\ep": yank-last-arg # bind to Alt-p
Control-l: clear-screen
set keymap vi-insert
# # these are for vi-insert mode
"\e[A": history-search-backward
"\e[B": history-search-forward
"\ep": yank-last-arg
Control-l: clear-screen
$endifcd -, скорее всего не знают и про pushd и popd.sudo !! спасибо!man hier, в которой рассказывается о том, где что лежит.C-p C-a sudo <space> cat /dev/urandom | od -h — имитируем фильмы про хакеров, ну или как застравка с видимостью процесса.fuser -c /etc — посмотреть кто из программ использует текущий каталогgrep -rl 'server-status' /etc/ — поиск текста внутри файлов в указанной директорииfind /var/www -type f ! -name *.jpg -exec grep -rl "text" {} \; grep(1) и сам умеет пропускать бинарные файлы:-I Process a binary file as if it did not contain matching data; this is equivalent to the --binary-files=without-match option.grep 'text' /var/www/**/*^*.jpg(.) — zsh, с setopt extendedglob. В 99% случаях zsh позволяет записать то же быстрее. Только не используйте такой вариант если вам нужно быстро найти файлы или найти очень много файлов. Во втором случае если for или echo такой список сожрут как встроенные команды, получающие своё внутреннее представление списка аргументов, то внешние команды упрутся в ограничение на длину командной строки.find и при этом имеет много возможностей, которые пришлось учесть в коде. Во‐вторых, zsh сначала найдёт все файлы, а потом уже запустит что‐либо, а find будет выдавать результат по мере нахождения в соответствии со своим вводом (это я про рекомендованный + в конце — он не даст find запустить команду, пока не будет сформирован максимально длинный список аргументов).
$ cp /path/to/file.txt{,.backup}
$ mv /path/to/file.{txt,log}
sed -i '/s/true/false/' *.htmlapt-get install bsdgames
/usr/games/tetris-bsd… И много часов потерянного времени =)
15 малоизвестных команд Linux