Pull to refresh

Comments 224

man, cd, sudo — малоизвестные команды?! Либо у автора дурацкий юмор такой — либо он сам плохо Линукс знает…
Ну, я с линуксом работаю с начала двухтысячных, а о варианте «cd -» и «sudo !!» не знал. Так что вполне себе интересные команды.
Еще трюк с cd: если вы в директории ~/dev/project/production/app/controllers и вам нужно в ~/dev/project/development/app/controllers, можно написать cd production development. Другими словами, с двумя параметрами cd работает как replace.
хм. А какой шелл? В debian не работает.
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
zsh 5.0.5 (x86_64-apple-darwin14.0), но у меня работало всегда и везде.
"!!" вообще полезная штука. Если вдруг забыл набрать cd перед путем до директории, можно сделать такой же трюк, как и с sudo, т.е. «cd !!» :)
Например:

[user@comp /]$ /home/user/projects
bash: /home/user/projects: Is a directory
[user@comp /]$ cd !!
cd /home/user/projects
[user@comp projects]$ 

ещё можно использовать Esc, Dot (.), для подстановки последнего аргумента последней команды, иногда удобней чем !!:
$ ls -al /path/to/directory
$ cd <ESC> <.> # преобразуется в cd /path/to/directory
Какие-то злостные молчаливые минусаторы хабр скроллят, дельный комментарий же.
Хотя в топике и упоминалось уже, действительно удобно пользоваться <.> или <.>. На мой взгляд, это быстрее, чем жать <1><1>.
Ну так!!! это фишка bash, а не sudo… так что ее можно с любой командой использовать… или вообще без команды (просто вызов второй раз запущенной до этого команды)
А ещё можно этот поиск сделать более полезным/избирательным
!ssh — вызовет последнюю команду, которая начиналась на ssh
Это фишка zsh. Ещё Вы можете написать cd ~/d/p/p/a/c и точно так же попадёте в ~/dev/project/production/app/controllers
Но sh и bash так не умеют ;)
А еще fish есть ) пара работников пользуется, говорят удобно… но мне как-то не очень понравился, плюс не совместим с POSIX sh.
Спасибо, не знал.
Очень часто необходима данная команда при работе с сайтом =)
Еще есть pushd/popd для работы со стеком директорий:
humbug@pc ~ $ pushd /usr/
/usr ~
humbug@pc /usr $ popd
~
humbug@pc ~ $
Чтобы не привыкать использовать pushd вместо cd, можно ключить опцию setopt autopushd.
Ну хорошо. cd - знают не все.

Но sudo !! — это же не отдельная команда! Это комбинация общеизвестного sudo — и символа повтора предыдущей команды !!. Малоизвестным является именно второй — но он не является командой.

А man-то, man? Как вообще он мог попасть в статью под заголовком «15 малоизвестных команд unix»?
man — не малоизвестная команда, ее вы найдете в любом учебнике Unix'а, однако я бы хотел обратить ваше внимание на некоторые ее особенности.

В общем, дело не в самом man-е, а в паре необычных man-страниц.
Кроме !! есть и другие, не менее полезные, команды для работы с историей
!^ — первый аргумент предыдущей команды;
!$ — последний аргумент предыдущей команды;
!* — все аргументы предыдущей команды;
!-2 — вторая с конца команда.
ещё можно открыть history а потом !номер_комманды_в_истории. Удобно искать иногда через history | grep
Или !git выполнит последнюю команду содержащую слово git.
не содержащую, а начинающуюся с него.
На тот случай если вы не знали — повторные нажатия Ctrl+R показывают другие (ранние) команды, подпадающие под введённую маску.
Что в zsh настраивается через раскладку isearch. У меня в поиске работают <C-n> и <C-p> для предыдущего/следующего результата. <C-r>, впрочем, тоже работает.
вроде бы последний аргумент предыдущей команды $_ или это только в bash?
В zsh тоже. А <A-.> у меня почему‐то подставляет всю предыдущую команду целиком, хотя я это сочетание не переопределял и в zsh -f … bindkey -e значение то же — подставить последний аргумент.

Учтите, что при использовании $_ в истории сохранится $_, а не сам аргумент.
!:A-B – аргументы с A по B в предидущей команде
Вы придираетесь. Считайте «man man» за команду, а «man» за утилиту.
Немногие знают, что man-страницы можно читать и без команды man:
zcat /usr/share/man/man1/man.1.gz | nroff -man | less

Соответственно, в man, как и в less, можно пользоваться w и z для пролистывания страниц, / для поиска текста и т.д.
Вспомнил — можно в процессе набора команды нажать Alt+h (stands for help) и попасть и man этой команды. А потом, когда выйдете из man'а, ваша набранная строка останется нетронутой. Удобно, когда забыли какие-то ключи, например. Рекомендую попробовать git log Alt+h
Вы в каком терминале так делаете? У меня в стандартном терминале MATE не работает Alt+H
Оказалось, это только в ZSH. Переходите, не пожалеете. Рекомендую вот этот «фреймворк», как они себя называют. github.com/sorin-ionescu/prezto
Ещё меньше людей знают, что все три команды настраиваются в /etc/man.conf, и в качестве второй у меня вместо nroff скрипт для обхода какого‐то бага с русскими руководствами при установке пакета в paludis.

Если быть более точным, то вместо первой может быть несколько распаковщиков (выбираются по расширениям, не по mime‐типу от file).

И, кстати, less вполне может сделать всё за вас: less /usr/share/man/ru.UTF-8/man1/rview.1.xz показывает читаемую страницу. Зависит от каких‐то настроек (которые в Gentoo по‐умолчанию, а где‐то ещё нет) и является одной из причин, по которой я практически никогда не использую less filename (вторая — suffix alias cat file L удобнее, если вы хотите заменить L на что‐то ещё).
Ну это именно и есть less, именно он отрабатывает w,z,/ и прочее. Достаточно в баше написать export PAGER=less а можно даже cat
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$ 

Вот вам сразу три способа читать man без стандартного пейджера :-)

В качестве бонуса: вот так можно использовать vim со всеми его плюшками в качестве MANPAGER:

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>' -\""
> sudo!!!

Имхо, так лучше вообще не делать. Причин две — логирование в хистори конкретно того, что было выполнено (а это может иногда пригодиться), и вторая — имхо, важно видеть, что именно собираешься выполнить под рутом _перед выполнением этого_.
sudo часто забываешь написать, но при этом понимаешь, что будет выполняться из-под администратора. А в логах будет и предыдущая строка.
У меня лично был один раз случай, когда из-за недосыпа подобным образом выполнил совсем не то, что было нужно. Благо были бэкапы, но все это стоило мне много нервов.
С тех пор я четко придерживаюсь правила — на боевых серверах (либо у клиентов) под рутом — всегда перед нажатием enter визуально проверять то, что сейчас будет сделано.
Ну я тоже как бы обычно отматываю вверх и дописываю в начало sudo, если забываю. Но это ведь применимо не только для sudo, что и хорошо.
Проще написать sudo и нажать Alt-. (или Esc-.).
По моему тут безопасней из хистори отмотать нужную команду и начало sudo прописат) А то вдруг, вы случайно перед прошлой командой пробел поставили;)
mva  ~  whoami # Enter
mva
mva  ~  sudo!!! # Enter
mva  ~  sudo whoami # (т.е. сначала подставилось для проверки)
root
mva  ~  echo $0 # :)
zsh
В history запишется именно полная команда.
В zsh есть опция HIST_VERIFY, которая решает обе проблемы. Если она включена, по enter команда на исполнится, а появится в развернутом виде.
$ rm -rf /
$ sudo !! <RETURN>
$ sudo rm -rf /
zsh — это совсем другой разговор, достойный отдельной статьи. Ибо он умеет очень многое.
Еще в секцию про man очень бы стоило добавить, просто как good practice, читать маны на «опасные» команды. именно man, а не -h/--help

Сейчас вроде этот «баг» исправили, но вот в начале 2000 кажется, я очень повеселился, когда хотел сделать отложенный ребут, посмотреть ключики для него и моментально отправил сервак в ребут командой reboot --help. куищще тогда был написан так, что вне зависимости от ключей тупо моментально ребутал машину :-)

вы уверены, что ключик -h у команды rm не означает «удалить все хардлинки с диска»? а у fdisk — «прописать какую-нибудь дефолтную таблицу разделов на всех хард-диски»?
я понимаю что для каждого это должны быть его личные грабли, по которым он прошелся, но было бы интересно почитать про ваши грабли с развернутыми историями
Alt+. это последний аргумент предыдущей комманды. Например:
vim /usr/local/etc/nginx/nging.conf # Decided to make a backup
cp Alt+. Alt+..backup
вот это полезная штука, да и вообще, выучить хоткеи, и работа с терминалом в разы просто ускоряется
Блин, круто, спасибо.
Кстати в макос не работает хоткей, но работает «Esc .», как выше преложили.
Если у вас iTerm2, нужно включить Settings — Profiles — Keys — Left option acts as +Esc.
У меня ZOC в основном, там наверняка тоже есть подобная настройка.
Но т.к. работать приходится из совершенно разных мест, имхо проще запомнить через Esc. :)
В стандартном Terminal тоже можно: Preferences -> Settings, выбрать Keyboard tab. Поставить галочку «Use Option Key as Meta».
А еще есть ^R для поиска в истории.
Затупил и жал Alt+ (по сути получается Alt + =) — оказывается, аналог двойного нажатия tab (показывает варианты продолжения).
То же самое можно сделать по Ctrl+d.
$_ я уже упомянул. А ещё раньше — ivanko (http://habrahabr.ru/post/228999/#comment_7756763). Повторю здесь: с !$ и <A-.> в истории сохранится тот аргумент, с которым вы запустили команду. С $_ в истории сохранится $_. Иногда это именно то, что вы хотите, иногда нет.
Увы мне, невнимательному. А разницу понял, спасибо!
UFO just landed and posted this here
поправил, но в оригинале именно Unix был
UFO just landed and posted this here
С pkill надо бы поаккуратнее, потому что она принимает не имя приложения, а паттерн, и пытается замочить все процессы которые под этот паттерн подходят.
Специально для админов-новичков есть команда killall5, которая так соблазнительно выглядит, когда нет установленного killall… Впрочем, оставим эту детскую граблю для личного удовольствия каждого.
когда нет установленного killall
И так тоже бывает?.. Черт, это же хуже, чем когда в «семерке» телнета не стало!
На бездисковых системах часто экономят на всём (даже man'ов нет) — каждый установленный пакет — отожранная память у сервера.
В busybox же команда killall есть… Или для бездисковых систем еще и busybox компилируют, выкидывая лишние аплеты?
Особенно когда пытаешься уместить openwrt в 4мб флеш-памяти) А если всего 2мб)

Правда выкидывать куски бизибокса — все равно экономия на спичках
Ну как сказать… Выпиленные ненужные мне части бизибокса позволили сэкономить около 100кб. Именно их мне и не хватало :)
Нет, в нормальных бездисковых серверах (я про крупных товарищей, до 128Гб памяти на борту) таким не занимаются. Но и лишнего в загружаемый image тоже не ставят — надо — можно добавить.
думаю, что немного найдется линуксоидов, которые не наступили на эту граблю в первый раз усевшись поадминить солярку.
Мне повезло, у меня это оказался workstation. Но впечатления незабываемые.
Только не пользуйте killall в Solaris — там он полностью соответствует своему переводу.
yes обычно нужна, чтобы подтверждать выполнение каких-то операций, если мне память не изменяет? т.е. что-то вроде
yes | <команда, запрашивающая ввод yes>
yes походит для генерации паттерна. В моих бенчмарках yes обгонял urandom.

А вообще, yes no отвечает на вопросы однозначно.
Половина команд — мусор. Кого волнует ddate? Да и, честно, кого в шелле волнует факторизация чисел?

nl не нужен, cat -n отлично его заменяет. Более того, -n умеет и grep, что покрывает само по себе 90% случаев, когда нужна нумерация.
Потому-то команды и являются малоизвестными, очевидно же…
Согласен с вами, за исключением команды factor. Она бывает очень полезна, например, при программировании, потому что другой возможности быстро разложить число на множители или проверить его на простоту, не пользуясь внешними программами, я не знаю.
Задачи безумно далёкие от шелла. Шелл — ДСЛ под задачи юникса. Понятно, что конкретная программа может делать что угодно — хоть Коран цитировать, но это будет явно за областью нормального применения шелла и точно за пределами coreutls/fileutils.
Ну вот я Python shell часто использую как калькулятор =) Предназначение? Думаю, нет. Удобно? Да, очень!
Ctrl+u удаляет текущий текст в командной строке в специальный буффер. Ctrl+y вставляет из него. Удобно когда вы что-нибудь забыли. Например:
git commit -m 'Initial commit' # Here we remembered that we didn't add files to staging
Ctrl+u
git add .
Ctrl+y # Now we have our git commit message again.
Всегда пользовался ^U, но про буфер — не знал. Спасибо!
UFO just landed and posted this here
Да, я думал, что это не очень подходящий пример, но суть из него можно понять. Кстати, -a не добавляет новые файлы.
Будет справедливо напомнить, что это фича не командной строки, а библиотеки readline, которую и использует командная строка. Вот еще немного возможностей её использования.
Кстати, сама библиотека проста для встраивания, есть возможность повесить свой обработчик для автодополнения по табу и еще 100500 фич.
Readline по возможностям не сравнима с zle — я, например, могу написать эмуляцию <C-o> из Vim (<C-o> запускает одну команду нормального режима из режима вставки, и потом возвращается в режим вставки) (собственно, и написал). Причём бо́льшая часть работы переложена на уже имеющуюся раскладку vicmd. Здесь есть подсветка синтаксиса (жаль только что не встроенная — встроен только API для подсветки регионов), возможность переопределить всё и вся (один человек ради интереса написал аналог ipython как надстройку над zsh: github.com/Valodim/zsh-python-mode (перед тем как жаловаться, прочтите README)), множество раскладок (по‐умолчанию обычные три и как минимум одна специальная: viins и vicmd для поддержки vi режима, emacs для соответствующего режима и специальная isearch, используемая для <C-r>).

Жалко только, что zle нельзя никуда встроить.

К чему это я: утверждение, что командная строка использует readline в общем случае не верно. Бо́льшая часть того, что я ввожу, вводится в zle. Все возможности readline там есть, а раскладка по‐умолчанию содержит практически всё (некоторые клавиатурные сочетания определены несколько по‐другому), что есть в раскладке emacs из readline.
часто пользуюсь фиксом "^src^dst" при опечатках:
arth@arth:~$ lq /
lq: команда не найдена
arth@arth:~$ ^lq^ls
ls /
bin   dev  home ...


ещё, когда всё пропало(какая-нибудь утилита загадила консоль бинарными символами): reset

Два в одном, посмотреть смонтированные файловые системы, и улучшить вывод табами:
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)
...
ещё, раз есть df, нужно также сказать про du — считает размеры папок:

du -h --max-depth=1
Обычно использовал:
du -sh * | sort -h

попутно выводит и файлы, и сортирует по размеру (к сожалению, "-h" у sort поддерживается не везде), потом узнал о ncdu
Регулярно пользуюсь ncdu, чтобы почистить сервер. Но здесь эта утилитка — оффтоп, т.к. не включена в дистрибутив.
Чтобы вернуться к предыдущей или следующей команде, используйте Ctrl+p и Ctrl+n вместо стрелочек. Так вы сможете не отрывать руки от клавиатуры. И не забывайте о поиске по Ctrl+r.
Чуть не поставила автору минус :)) Но потом прочитала про factor, yes, и man units. Спасибо :)
1) Не все почему то знают что можно сказать просто «cd» и попасть в свой хомяк, а можно сказать «cd ~username» и попасть в хомяк username'а.
2) rev — переворачивает строчку задом на перед.
$ echo abc | rev cba $
3) Команду exit\logout можно заменить на Ctrl+D (в большинстве современных шелов).
4) Ctrl+Shift+3 — ставит в начало строки знак комментария и нажимает Enter. Удобно когда пишем какую то длинную команду и тут возникает вопрос — вам нужно обработать условно "/home/username/www" или "/home/username/public_html". Обычное решение: открыть вторую вкладку в терминале, снова зайти на сервер, посмотреть, вернуться в первую, дописать. Неудобно потому что снова коннектится надо, а ключа нет, потому что вы вошли по паролю, который у вас в почте, которая на другом экране, и все стирать (жать Ctrl+C) не хочется потому что уже почти всю команду вписали, осталось совсем чуть чуть. А тут жмем Ctrl+Shift+3, смотрим путь, нажимаем вверх, дописываем команду, Enter, удивляемся почему не сработало, наживаем вверх, Home, Del (удаляем символ комментария в начале строки) Enter, радуемся.
Ctrl + Shift +3 не работает почему-то. ubuntu+bash+putty
Таки да. Отработало даже в guake.
mint + bash + putty — работает нормально, это под XP в виртуалке. Может ваша ОС это перехватывает? (переключение языка например по Ctr+Shift или еще какое-либо ПО).
возможно, но мой вариант останется в history, а ваш нет.

Как говорится привычка — вторая натура.
Привычка это да, но мой вариант тоже останется в истории после того, как вы его исполните. Или вам нужен в истории тот, что закомментирован?
естественно тот что закомментирован. Понятно что выполненная команда и так останется в истории (кроме некоторых случаев, частично оговоренных в посте.

Кстати про "[space]command". В этих Ваших интернетах говорят про HISTCONTROL, описанный в мане, который отвечает за сохранять али нет команды, введенные с пробелом в начале :)
Вау. Вот это реально полезно. Уже 20 лет юниксами занимаюсь, а такой полезной комбинации не знал. Премного благодарен.
Веселая штука, действительно, надо будет еще по разделам написать подборку, отделив веселые от серьезных
Подборки весёлостей уже много раз были. А вот полезности не стыдно и повторить.
А в Debian уже довольно давно есть sl. Пускаю его когда совсем скучно.
Напишу, может, подборку единым списком
в виде постера бы) чтоб на стену повесить и пользовать, а то в виде статьи оно прочитывается и забывается через пару недель)
Перед тем, как делать подборку, посмотрите вот на этот ресурс. Там много чего можно почерпнуть.
Тот случай, когда узнаешь, сколько бесполезных вещей у тебя установлено дистрибутивом из коробки в посте, а в комментариях узнаешь сколько полезностей умеют постоянно используемые инструменты.
На Хабре в большинстве постов узнаешь больше полезной информации, чем в посте )
>>> «Начнем с простого, команда man, что означает manual. Если хотите прочитать о какой-либо команде, просто наберите: „

Не смешно. Лучше бы про info написали. Про неё почему-то почти никто не знает.
Да. Нигде о ней ещё не слышал.
P.S. Прошу прощения за случайный минус (тачпад) и возвращаю в карму.
За плюсы в карму — благодарю, а то злые люди минусов накидали, и без тегов стало как-то грустно жить. :)
info — отвратительное порождение GNU, которое решило, что оно not unix. Никто им в нормальном состоянии не пользуется, оно неудобно, с ужасной навигацией и форматированием. Если бы не уверенность gnu, что мануалы к coreutils/fileutils должны идти в первую очередь в info, а в man — только короткие выжимки, то про неё бы давно забыли как про страшный сон.
Не соглашусь. После освоения навигации хелпа vim вполне комфортно пользуюсь info. И когда настраиваешь систему на linux, не имея выхода в интернет (военные объекты на пространствах РФ) — info спасает.
Ну, info в emacs-е довольно удобно пользоваться :-)
jot

Прямо неуловимый Джо

Так можно подборку из 100500 малоизвестных команд сделать. Нужно писать про те, которые есть в LSB (и следовательно в каждом дистрибутиве) хотя бы.
Спасибо. Даже если я и знал часть, то всё равно было познавательно и забавно. Особенно таблица аски. Всегда ради неё гуглил, а тут оказывается она всегда под рукой.

А брюзги есть в любом линукс посте. У нас если автор рассказывает по линуксу то что ты знаешь, то значит автор не прав и его надо сжечь на священном костре холивара. Так что всё это ерунда.
seq x [y] печатает последовательность чисел. Удобно в виде
for i in `seq 10`; do echo $i; done
Еще можно:

$ seq start [[step] finish]

step не обязательно целое
Мне недавно показали такой башизм, я удивился, но использую:

for a in {1..10}; do echo $a; done
интересно
но у seq свои удобства: ему можно сказать, чтоб заполнял нуликами слева (удобно, если вставлять в имена файлов, лучше сортировка):
$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10

У меня работает даже так:
$ for a in {01..100}; do echo $a; done

Т.е. указать один нулик, если не знаешь точно второй аргумент. Добавит нужное количество нуликов сам.
В zsh этот вариант генерирует 01 02 …, а не 001 002 …. Не думаю, что такое поведение некорректно: в вашем случае вы лишаетесь возможности генерировать именно то, что генерирует zsh (я несколько раз видел номера серий в стиле 01 02 … 99 100 101 …).
Полезно. А то я всегда через a=`printf %02d $a` нули добавлял :)
Конкретно для переменных в zsh есть ${(l:2::0:)a} и typeset -i -Z2 a.

Первое добьёт строку нулями до данной ширины. В качестве ширины можно использовать $#max и вообще любое выражение, не содержащее разделители (в примере у меня и в документации — двоеточие, но разделители могут и не быть двоеточиями). Второе объявит, что, во‐первых, данная переменная является целочисленной, а, во‐вторых, что при подстановке её следует дополнять нулями до данной ширины.

С typeset дополнять можно только нулями или пробелами, с ${(l)} вы можете дополнять чем угодно, включая нулевые байты (используйте формат ${(pl:2::\0:)VAR} — обратить внимание на p).
Ну ставить другой шел на кучу машин ради паддинга я точно не буду) Но разнообразие вариантов решения впечатляет.
А еще есть программа по имени vrms, — виртуальный Столлман.
Есть программа sl — вызывает паровозик.
Причём, есть уже не везде из коробки (субъективно раньше чаще встречалась). Это же так прекрасно — ставить из репозитория паровозик! :)
А vrms никогда не видел из коробки.
Я часто использую такие вещи:
[ESC] +. (точка) — аргумент из предыдущей команды. Допустим смотрим содержимое какого-либо файла:
cat /etc/samba/smb.conf
потом понимаем, что нужно отредактировать. Чтобы еще раз не вводить полный путь делаем просто:
vim [ESC] + . — bash сам подставит аргумент.
Переход по директориям не учитываю регистр символов:
в файле /etc/inputrc дописываем следующее:
set completion-ignore-case On
Еще пример, получаем вывод ошибок, что в каком-то файле, в такой-то строке (допустим 78) — ошибка, делаю так:
vim +78 file
и редактор открывает файл сразу на указанной строке.
в файле /etc/inputrc дописываем следующее

Но зачем? Ведь есть ~/.inputrc. Как уже упоминалось в комментах, многие фичи реализует библиотека readline, она же читает файл inputrc. В REPL, которые используют readline, будут работать всё те же горячие клавиши. К примеру, интерпретатор Python подхватывает настройки и работает аналогично shell.
Мой результат — 8/5. А персональный хит-парад любимых команд выглядит так:
1. tar -cf — dir1 dir2 dir3 | tar -C /dest/directory -xvf — — скопировать каталоги вместе с именами пользователей и правами доступа
2. df -h — ключ -h означает показывать результат в человеко-читаемом виде
3. `` — подстановка результата команды в командную строку. Например, grep -li CONST `find. -name *.h` найдет строки, содержащие   CONST во всех файлах *.h от текущего каталога и ниже по иерархии.
4. () — группировка. Например, команду из первого примера можно переписать так: tar -cf dir1 dir2 dir3 | (cd /dest/directory; tar -xvf -)
5. Нежно люблю пакет ImageMagick, и особенно команду mogrify для работы с изображениями. Например, mogrify -resize 1920x1080 *.jpg сделает именно то, что ожидается — подгонит размер всех картинок под заданный размер, не меняя aspect ratio.
3. Здесь надо помнить, что в случае с find ваше утверждение верно только до тех пор, пока в именах файлов нет пробелов, табуляции и новых строк (в именах файлов может быть всё, кроме нулевого байта). По этой причине я буду использовать **/*.h, find|xargs (новую строку в имени файла в «диком виде» я видел ровно один раз и то только потому, что konqueror позволил мне её туда закопипастить — во всех остальных случаях она помещалась туда намеренно с целью тестирования) или что‐нибудь ещё, но никак не $(find). $(что‐то ещё) я использую, но только когда точно знаю, что это «что‐то ещё» выведет.
4. Для группировки лучше использовать {}. () ценна тем, что создаёт новый shell, соответственно окружение (текущий каталог, переменные окружения, ограничения на потребления ресурсов (ulimit)) не изменится, что бы вы там не делали. {} новый shell не создаёт. Конкретно в вашем примере из‐за cd нужен новый shell, а не группировка.
5. Я использую ImageMagick, чтобы создавать скриншоты (import): во‐первых, в моём fluxbox для его использования созданы клавиатурные сочетания, во‐вторых, ImageMagick присутствует на многих системах, что значит, что если он там, то мне не придётся думать, как сделать скриншот здесь. import умеет брать скриншоты всего экрана (указанного в командной строке или тыкнутого мышкой), конкретного окна или даже области, которую вы выделяете мышкой и сохранять сразу в запрошенном формате.
1. timeout — выполняет команду, по истечению времени убивает;
2. numfmt --from=si 1M — форматирует число. Например из 1M сделает 1000000, из 1K — 1000. Умеет и в обратную сторону
3. shred — перезаписывает файл случайными данными заданное число раз
4. nproc — печатает число процессоров
5. tailf — синоним tail -f, печатает только новые строки, появившиеся в файле с момента запуска команды
6. users — печатает имена всех залогиненный пользователей
7. fsfreeze — блокирует запись на файловую систему до момента unfreeze(системные вызовы записи не завершаются до анфриза). Удобно для надёжного чекпойтинга подмонтированной ФС. (лучше не делать на /, а то потом не сможем разморозить)
8. findfs --LABEL=«windows» — находит файловую систему по метке или по UUID, blkid — выводит список меток и UUID'ов всех ФС, lsblk — выводит блочные устройства в виде дерева
9. look — ищет строки начинающиеся с подстроки в отсортированном файле(бинарным поиском)
10. lslocks — показывает файловые локи
11. ipcs — показывает объекты ipc(shared memory, message queues и семафоры), они иногда утекают, т.к не привязаны к процессам. ipcrm — удалить объекты ipc
12. script — записывает сессию в файл, умеет записывать информацию о задержках в нажатии клавиш, scriptreplay — воспроизводит записанный файл, например, script --timing=file.tm script.out; scriptreplay --timing file.tm --typescript script.out
13. dmidecode — информация о системе, lscpu — информация о cpu, lshw — ещё одна информация о системе, lspci, lsusb
14. getent passwd — список пользователей, работает и в системах где пользователи не хранятся в /etc/passwd, а, например, в ldap
15. losetup -f — найти все разделы в образе диска из файла и сделать их доступными, как /dev/loop*
Проверил что кто-то уже запостил ссылку на commandlinefu — можно и спать пойти.

З.Ы. для полного счастья не хватает только линка на explainshell.com/
tailf — это чуть лучше чем просто синоним «tail -f», особенно для ноутбуков:

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.
Ctrl+R — поиск по истории команд, наверное самая удобнейшая штука.
time — время, потраченное на выполнение команды
аргумент -h для многих стандартных утилит(coreutils) выводит числа с приставками. например для df или ls выведет размер в кило/мега/гигабайтах
Мнемоника для аргумента -h: --human-readable
Лучше использовать <C-p>/<C-n>, а не стрелочки. До стрелочек долго тянуться. А <C-r> незаменим в сложных случаях (я помню, что что‐то такое писал, но что именно — вопрос).
Вполне возможно; просто такое поведение стрелочек характерно для tcsh(1), который шелл по умолчанию во FreeBSD. Въедливая привычка, быстро подсаживаешься. :-)

Забавно, что ^P/^N в 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.
Ценное замечание; видимо действительно, «умное» поведение стрелочек по умолчанию — это кастомизация FreeBSD.
много чего из приведенного в комментариях (да и в самом посте) отсуствует в базовых поставках той или иной ОС.
И снова мало кто знает, но time это встроенная команда bash, а еще бывает внешняя программа time которая умеет показывать много всякого.
$ /usr/bin/time -f %M ls
852
$ \time -f %e ls -R /
...
Command exited with non-zero status 2
3.09
$

Ну и что бы 2 раза не вставать:
\команда выполняет именно внешнюю команду, а не алиас или строенную переменную.
$ 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, встроенная в оболочку.

Кстати, если речь идёт про bash, то \ll не отменит исполнения функции, определённой в переменной окружения (зато bash не даст определить alias \\ll). Если речь идёт про zsh, то не отменит исполнения command_not_found_handler (при желании можно использовать для того же, только с меньшим приоритетом — с command_not_found_handler, выполняющего функции из переменных окружения (смотреть export -f в bash), вы не переопределите sudo).
А для того, чтобы запустить именно команду, а не shell builtin, alias, функцию или что‐то ещё есть command: command echo 'Not a built-in echo'.
все кроме 6 и 2 в этом посте описано. 6 у меня не работает (mint + guake + bash), второе — ну как бы так сказать, с одной стороны оно конечно команда, а с другой программа из одной строчки на perl — такая же команда.
4тый я уже не первый раз вижу, но не хочу этим пользоваться дабы случайно не выполнить то, чего я на самом деле не имел ввиду.
Всегда удивляло, почему в man-страницах разработчики не при приводят примеров. Неужели трудно привести пяток самых распространённых случаев применения команды? Ведь один пример может сэкономить кучу времени…
Во, а это интересно. С одной стороны cd это не внешний бинарник, а с другой стороны "\cd" обрабатывается именно так, как и обычный «cd»

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.
Ага, спасибо за разъяснения. Никогда даже особо над этим не задумывался
Первое Спасибо за статью Автор!
Второе спасибо всем кто поделился очень интересными комментариями

Огромный вклад в мой мозг!
Фокус с !! работает и с man тоже. То есть если набрали какую-то команду, а она непонятно чего делает или сделала, то man !! выдаст мануал по предыдущей набранной команде.
Когда вы внутри man, то можно искать по регулярным выражениям просто набрав /
Все искомые строки будут подсвечены, переход между ними по n — вперед, N (Shift+n) — назад
Для просмотра файла можно использовать и команду less, либо подставлять ее как пайп (через |), в ней так же работает поиск как и в man
Для просмотра логов есть отличная команда tail, которая покажет вам конец лога, а если задать tail -f то новые строки будут выводиться по мере добавления их в логфайл.
В большинстве дистрибутивов man использует less для вывода. Какой pager используется можно посмотреть написав echo $MANPAGER
Команды less похожи на команды vi, жаль только инкрементального поиска нету (есть форк какого-то чувака на github'е, который это реализует.)
Какой pager используется можно посмотреть написав echo $MANPAGER
Нельзя или не везде — у меня он определён в /etc/man.conf, а не в переменной окружения.
Я добавлю своих команд:
watch — запуск команды каждые n секунд и вывод результата на экран. К примеру, watch lsusb будет каждые 2 секунды (по дефолту) исполнять lsusb и выводить на экран. Удобно!
apt-file search — поиск файлов в пакетах активных репозиториев. К примеру, очень надо узнать, какой пакет из репозитория установить, чтобы достать бинарник installwatch. Запускаешь apt-file search installwatch, находишь в пакете checkinstall.
checkinstall — сборка из исходников в Debian-пакет. Must have, если не хочешь превратить Debian в Slackware. Теперь собранные из сорцов программы наконец-то можно нормально удалять и обновлять!
uptime — аптайм+количество сессий+loadavg
screendump — берёт содержимое терминала и выпихивает его через stdout. Если перенаправить в файл, получим скриншот терминала текстом =)
amixer — консольная утилита, которая меняет параметры alsa — к примеру, громкость, mute и тому подобное. Именно ей можно менять громкость в bash скрипте, к примеру, вешать на функциональные клавиши ноута — или мультимедийные клавиши клавиатуры =)
update-alternatives — меняет приложения для выполнения действий по умолчанию. К примеру, если при нажатии кнопочки «Браузер» в графическом меню WM у вас запускается не браузер, а довольно-таки глючный и тормозной Iceweasel, то заменить его Chromium-ом можно именно этой командой =)

Ещё немного алиасов:
alias 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

Ваша статья ну явно не рассчитана на тех пользователей, которые не знают про Ctrl+C.

Таких статей можно написать очень и очень много. Думаю, именно поэтому ценность переводов таких статей довольно низкая — на каждом английском околоайтишном сайте есть индус, который пишет 5 штук таких статей в день, запихивая туда всякие очевидности и бесполезности… Вот если выпустить качественный курс статей, типа по 20 тщательно отобранных и реально полезных в работе команд каждую среду, то будет очень и очень хорошо =)
Для dirsize есть du -hs. Я обычно именно так и набираю.
"du -sh" гармоничнее звучит/выглядит
В конце должно быть то, что вам, скорее всего, захочется изменить. Я не раз менял -s на --max-depth=1 (почему‐то -s я легко запомнил, а -d — нет).
Кстати, ключ -d не используется в du, который в debian stable. Есть только --max-depth =(
Во всяком случае, так на моём домашнем сервере. Вполне возможно, давно не обновлялся — но факт есть факт.
checkinstall — сборка из исходников в Debian-пакет

однако это внешний пакет (на самом деле это bash-скрипт над build-essentials или что-то в этом роде)
Да тут в комментариях этому правилу никто не следует, так что всё нормально =)
Кстати про CTRL + C и единственный способ. Ещё со времен UNIX'ов и по сей день есть замечательное сочетание клавиш CTRL + \. Оно посылает SIGQUIT активной группе процессов. Помогает быстро прибить процесс, который не завершается по CTRL + C. Ещё полезно для создания coredump'а процесса.

Ещё многие почему-то думают, что при нажатии CTRL + C всегда один процесс получает SIGINT. Это не всегда так.
Странно, у меня это сочетание клавиш совершенно не рабочее. Ничего не происходит.
а у меня (в частности в vim, в режиме вставки) печатается ^\. Проверил в mint и centos на 3х разных терминалах.
У меня в vim совершенно ничего не происходит, а nano предлагает поискать. Проверял как в bash, так и в zsh. Ubuntu 14.04.
Так хорошо начали, а закончилось, как обычно, простым перечислением команд (:
1. А ещё лёгким движением клавиатурый дать человеку ссылку на определённый кусок man'a примерно вот так:
man -P 'less -p "-P pager,"' man

Ну или использовать man не для чтения man'ов, а, внезапно, для форматирования текста: dmesg | man -p t -l — :)
5. Ещё более опытные пользователи знают, что это фича не всегда включена и чаще всего по умолчанию оно сидит в $HISTCONTROL, который по умолчанию равен ignoreboth, что в полном виде означает ignoredups (который не сохраняет две подряд одинаковые команды) и (БИНГО!) заветный ignorespace. Я достаточно часто видел системы, где эта фича была отключена.

Тут в комментах все с таким упоением расскзывают про всевозможные Ctrl+? хоткеи. Все они работают по одной просто причине: обычно шелл по умолчанию работает в emacs mode, отсюда и всевозможные хоткеи. Для любителей vim'а можно взять и переключиться в vim mode ( set -o vim ) и наслаждаться ^ вместо Ctrl+A, $ вместо Ctrl+E, db вместо Alt+Bcksp и так далее.

зы. Только вот некоторые совсем вещи при таком переключении могут поломаться. Тот же поиск стрелками вверх/вниз по хистори или очистка экрана по Ctrl+l (невероятно привык именно к этой комбинации, по другому жить не могу). Но это всё легко исправляется небольшой правкой ~/.inputrc примерно в такой вид:
set 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
$endif
Те, кто не знает про cd -, скорее всего не знают и про pushd и popd.

Конечно же, команды приведенные в статье далеко не малоизвестные, но за sudo !! спасибо!

Ах да, в список man страниц, так же можно добавить man hier, в которой рассказывается о том, где что лежит.
Ещё очень удобно использовать mkdir с опцией -p:

mkdir -p Photos/2004/Summer/August/

Это чтобы не создавать вручную Photos, потом 2004, потом Summer, и, наконец, August.
А еще можно сделать так:
mkdir -p src/{main,test}/{scala,java,resources}

И будут созданы все возможные комбинации путей:
src/main/scala
src/main/java
src/main/resources
src/test/scala
src/test/java
src/test/resources
>> sudo!!!
s,u,d,o, Пробел, Shift+1, Shift+1
vs
Вверх, Home, s,u,d,o, Пробел

Итого в первом варианте нажимать на 2 клавиши больше.
В первом варианте вы не убираете руки с основного блока клавиатуры — это долго. Не надо сравнивать просто нажатия клавиш.
ok.
C-p C-a sudo <space>
нажатий столько же, только перед Enter есть возможность посмотреть на команду
В первом варианте тоже есть. Ценой использования zsh и дополнительного нажатия <Enter> — поэтому я использую что‐то вроде вашего варианта (вместо <C-a> у меня ,a, а остальное совпадает) (<C-a> занято в screen, ,a набирается так же быстро и всяко быстрее <C-a>a).
А, нет, у меня здесь ,i, а не ,a.
зато первый вариант будет лучше работать по медленному коннекту а-ля GPRS / перегруженный вайфай
Кстати, 11/15.
А вообще начал читать с мыслями «О боже, для кого он это пишет?». Дошел до пункта 5 и изменил мнение на «Первое мнение обманчиво». Спасибо. Кое что новое узнал.
Добавлю свои 5 копеек.
cat /dev/urandom | od -h — имитируем фильмы про хакеров, ну или как застравка с видимостью процесса.
fuser -c /etc — посмотреть кто из программ использует текущий каталог
grep -rl 'server-status' /etc/ — поиск текста внутри файлов в указанной директории
Добавлю по поводу последней команды: grep шерстит любые файлы, в том числе бинарные. Чтобы этого избежать (особенно для проекта с километром картинок), было бы неплохо совместить его с find и отрицанием на «ненужные» расширения, примерно так:
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.
Зачем find? grep и сам умеет искать только в нужных типах файлов ( ну или исключать ненужные ). Читай man grep на предмет опций --include и --exclude.
Ну и даже если вы очень хотите именно find ( вдруг вам ещё и конкретный диапазон даты изменения нужен ), то используйте \+ вместо \; для grep. Оно будет работать заметно быстрее.
upd. --include / --exclude относятся только к gnu'тому grep'у.
\+ — posix совместимо.
grep 'text' /var/www/**/*^*.jpg(.) — zsh, с setopt extendedglob. В 99% случаях zsh позволяет записать то же быстрее. Только не используйте такой вариант если вам нужно быстро найти файлы или найти очень много файлов. Во втором случае если for или echo такой список сожрут как встроенные команды, получающие своё внутреннее представление списка аргументов, то внешние команды упрутся в ограничение на длину командной строки.

В первом случае учтите две вещи: во‐первых, zsh не настолько оптимизирован как find и при этом имеет много возможностей, которые пришлось учесть в коде. Во‐вторых, zsh сначала найдёт все файлы, а потом уже запустит что‐либо, а find будет выдавать результат по мере нахождения в соответствии со своим вводом (это я про рекомендованный + в конце — он не даст find запустить команду, пока не будет сформирован максимально длинный список аргументов).
копирование/переименование файла c изменением названия по маске (чтобы не писать его 2 раза)
$ cp /path/to/file.txt{,.backup}
результат — /path/to/file.txt и /path/to/file.txt.backup
$ mv /path/to/file.{txt,log}
результат — /path/to/file.log
Недавно использовал команду\утилиту sed.
sed -i '/s/true/false/' *.html
редактирует html-файлы заменяя true на false.
pgrep — про эту команду тоже мало кто знает, как оказалось.
Ещё — для тех, кто работает в виртуальной консоли (те, которые вызываются по Ctrl+Alt+F1/2/3/4/5/6), может понадобиться удобный способ вставлять и копировать текст мышью. Просто установите gpm, и тачпад больше не будет просто неудобным пространством над клавиатурой, а длинные пути для cp/mv/dd/whatever не придётся набирать 2 раза.
/s/над клавиатурой/под клавиатурой/
И да:
apt-get install bsdgames
/usr/games/tetris-bsd
… И много часов потерянного времени =)

Не стоит забывать и про столь полезную команду, как dpkg-reconfigure. Она переконфигурирует установленные в системе пакеты, таким образом, можно добиться изменения поведения частей системы на желаемое ;-)
К примеру, в виртуальной консоли русские буквы отображаются ромбиками, а по высоте влезает мало букв. Как настроить кодировку, шрифт, размер шрифта и набор символов в виртуальной консоли? dpkg-reconfigure console-setup.
> gpm

Ух ты, оно еще живо. Я с ним еще в конце 90-х под FBSD развлекался.
UPD: память подвела, это в RH я с ним развлекался.
Sign up to leave a comment.

Articles