
№1. Переход в предыдущую директорию
Все мы используем команду
cd ..
для перехода в родительскую директорию. А для перехода к предыдущей директории можно использовать команду cd -
. Этот приём похож на кнопку «Назад».test@linoxide:~/Downloads$ cd -
/home/eyramm
test@linoxide:~$ cd -
/home/eyramm/Downloads
test@linoxide:~/Downloads$
Тут мы сначала находились в директории
Downloads
, затем переместились в директорию Home
, и, наконец, снова вернулись в директорию Downloads
.№2. Повтор последней команды
Для того, чтобы повторить предыдущую команду, просто введите
!!
. В этом примере мы повторим предыдущую команду с правами суперпользователя.$ apt install vlc
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
$ sudo !!
sudo apt install vlc
vlc is already the newest version (2.2.2-5ubuntu0.16.04.3).
Этот приём весьма полезен именно в ситуациях, подобных рассмотренной, когда команду, введённую ранее, надо выполнить с правами суперпользователя.
№3. Многократное выполнение команды до её успешного завершения
Для того, чтобы выполнять команду до тех пор, пока она не будет успешно завершена, используйте код возврата команды в такой конструкции:
while ! [command]; do sleep 1; done
Например:
$ while ! ./run.sh; do sleep 1; done
cat: run.sh: No such file or directory
cat: run.sh: No such file or directory
linoxide.com
Команда в этом примере будет повторяться до тех пор, пока не будет найден файл
run.sh
и его содержимое не будет выведено на экран.№4. Просмотр сведений о ходе передачи файла
Для того, чтобы наблюдать за ходом передачи файла, воспользуйтесь командой
pv
:$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=> ] 15% ETA 0:00:59
№5. Планирование заданий
Планировать задания в Linux можно с помощью команды
at
:echo wget https://sample.site/test.mp4 | at 2:00 PM
Для того, чтобы посмотреть ожидающие выполнения задания, воспользуйтесь командой
atq
.№6. Вывод данных в виде таблицы
Вызвав команду
ls
, или что-нибудь ещё, выводящее данные на экран, можно столкнуться с длинными списками, для просмотра которых требуется продолжительный скроллинг. То, что выводится на экран, легко можно организовать в виде таблицы с помощью команды column -t
. Например:$ cat /etc/passwd | column -t
Вот как выглядит то, что у нас получилось.

Вывод команды, организованный в виде таблицы
№7. Полезные комбинации клавиш
Команда
clear
очищает экран терминала. Комбинация клавиш Ctrl + L
позволяет добиться того же самого быстрее.Комбинация клавиш
Alt + .
позволяет перемещаться по ранее введённым командам. Комбинация клавиш Ctrl + U
убирает из строки всё то, что уже в неё введено. Например, можете это попробовать для очистки введённого в командной строке пароля.Для инкрементального обратного поиска по истории команд используйте комбинацию клавиш
Ctrl + R
.№8. Сжатие, разбиение и шифрование файлов
Передача больших файлов между компьютерами — задача непростая. Упростить её можно, сжав файлы с помощью команды
zip
, или, если файлы ну просто очень большие, создав многотомный архив. Если при этом файлы нужно ещё и зашифровать — воспользуйтесь ключом -e
.$ zip -re test.zip AdbeRdr11010_en_US.exe run.sh Smart_Switch_pc_setup.exe
Enter password:
Verify password:
adding: AdbeRdr11010_en_US.exe (deflated 0%)
adding: run.sh (stored 0%)
adding: Smart_Switch_pc_setup.exe (deflated 2%)
№9. Стресс-тест батареи ноутбука
Хотите узнать, как долго батарея вашего ноутбука продержится при полной нагрузке на процессор? Попробуйте следующую команду:
$ cat /dev/urandom > /dev/null
№10. Переименование или перемещение файлов
Если вам нужно быстро переименовать или переместить множество файлов с суффиксами — попробуйте команду следующего вида:
$ cp /home/sample.txt{,-old}
Вот как её можно расшифровать:
$ cp /home/sample.txt /home/sample.txt-old
Ниже приведён пример переименования файлов с определённым расширением в пакетном режиме:
$ ls
text_comes_here_1.txt
text_comes_here_2.txt
text_comes_here_3.txt
text_comes_here_4.txt
$ rename 's/comes_here/goes_there/' *.txt
$ ls
text_goes_there_1.txt
text_goes_there_2.txt
text_goes_there_3.txt
Итоги
Мы рассказали о нескольких приёмах взаимодействия с командной строкой Linux. Надеемся, вы нашли здесь то, что поможет вам упростить и ускорить повседневную работу.
Уважаемые читатели! Что вы добавили бы к нашему списку неочевидных полезностей командной строки Linux?
Комментарии (97)
Rosh1ck
21.08.2017 14:41+1$ cat /etc/passwd | column -t
Можно еще так для списка файлов:
$ ls -1
Self_Perfection
21.08.2017 18:36+6Только не
cat /etc/passwd | column -t
а
column -t /etc/passwd
Любая приличная консольная утилита, которая может принимать данные из stdin, может также читать их из файла, указанного аргументом командной строки. А с неприличными можно воспользоваться перенаправлением потоков ввода/вывода:
column -t < /etc/passwd
Stop piping cats! Не труби кота! Запуск процесса — относительно дорогая операция. Так что не надо дёргать утилиту cat когда это не надо.vgray
22.08.2017 09:58-1Мне чаще удобне сделать поставив cat первой коммандой.
Например:
1) смотрю файл — cat /etc/passwd
2) Ох, длинный какой — cat /etc/passwd | head
3) все равно нужных записей нет — cat /etc/passwd | grep 'XYZ'
4) ага, а теперь выделим только нужное — cat /etc/passwd | awk…
те чтобы заменить комманду достаточно нажать стрелку вверх и ctrl+wSelf_Perfection
22.08.2017 10:55+4Ну во-первых совет избавляться от cat актуален для кода, который будет исполняться многократно (скрипты, циклы), либо его будут читать другие люди (скрипты), т.к. более короткую запись проще воспринимать. А при повседневной работе делайте как удобно.
Но с другой стороны в описанном вами сценарии от использования cat удобнее не становится! Натравливать cat на файл неизвестного размера чревато, лучше сразу начинать с head $FILE. А чтобы потом отфильтровать по шаблону:
grep pattern Alt-.
Альт-точка подставит последний аргумент предыдущей команды (head)
Потом так же можно будет подставить в awk путь к файлу одним хоткеем.
Или ещё по-другому: начинать с less $FILE. Много лишнего и нужно отфильтровать? при запушенном less набрать
&PATTERN<enter>
И less спрячет строки не соответствующие шаблону. Сделать выборку? Опять же из запущенного less
!awk '{print $1+$2}' %<enter>
less подставляет путь к отображаемому файлу вместо %
ainoneko
23.08.2017 07:15
А если здесь перепутать направление угловой скобки?column -t < /etc/passwd
Self_Perfection
23.08.2017 08:57… то ничего не случится, потому что нечего работать от пользователя root.
Или придётся восстанавливать из бэкапа, который ведь у вас есть, правда? Ну в крайнем случае из
/etc/passwd-
А кроме того это ещё нужно поискать утилиту, для которой понадобилось бы использовать перенаправление ввода. Все GNU утилиты умеют читать ввода из файла.
netch80
21.08.2017 14:57+12> cat /dev/urandom > /dev/null
Это загрузит только одно ядро.trapwalker
21.08.2017 20:27+2Вот так интереснее, видно с какой скоростью рандомный поток летит вникуда:
pv</dev/urandom>/dev/null
jatx
21.08.2017 15:20Одна из самых полезных функций для меня — можно ввести первые буквы и нажать TAB. Автоматически добавляет окончание либо предлагает варианты.
VolCh
21.08.2017 15:26Для вариантов нужно второй раз таб нажимать. По крайней мере в баше по умолчанию.
nikolayvaganov
21.08.2017 15:37+2а еще есть bash smart completion которая не только автокомплит команд делает, а еще и аргументов.
unclechu
22.08.2017 10:47Ещё такое есть:
bind 'set show-all-if-ambiguous on' bind '"\C-n":menu-complete' bind '"\C-p":menu-complete-backward'
alff31
22.08.2017 11:55Ну без tab терминалом вообще невозможно пользоваться, а статья называется "… о которых никто не знает"
Sirikid
21.08.2017 15:32+1610 приёмов работы в терминале Linux, о которых мало кто знает
В какой оболочке? В каком терминале? В каком дистрибутиве?
Очередное "ненужно" от блога компании.
ziv
21.08.2017 16:14Ну, от эмулятора терминала, наверное, мало что зависит (разве что он будет глотать сочетания клавиш). От дистрибутива тоже вряд ли, если только он не поставит себе целью поломать те же сочетания.
А вот то, что кроме bash есть другие оболочки, возможно, таки является для них сюрпризом.Sirikid
21.08.2017 16:37+2А ещё bash может в любой момент наплевать на обратную совместимость и вообще bloatware. Про дистрибутив я написал потому что часть советов просто упоминание рандомных утилит (
pv
,zip
), возможно в каком-то дистрибутиве они и предустановлены, но в моем нет.
DerRotBaron
21.08.2017 15:34+1№9
Плохо подходит для многоядерных систем, если не запускать по количеству ядер.
Что-то близкое к требуемому одной командой можно получить, скажем, так:
cat /dev/urandom | pbzip2 -c > /dev/null
Таким образом получается утилизировать весь либо почти весь процессор
Cheater
21.08.2017 15:54+2Много мелких приёмов, всех не вспомнить. Например:
— Автодополнение можно настроить для чего угодно (man bash-completion), например сделать автодополнение имён веток в Git: «git checkout mas» дополнится до «git checkout master»;
— Добавление строк в реальном времени в конец файла можно наблюдать через tail -f;
— Можно обернуть вызов любой команды, где идёт передача данных через pipe, в утилиту pv, и будет отображаться прогресс переноса данных;
— Можно обернуть вызов любой команды, ожидающей текстовый ввод от юзера, в утилиту rlwrap и ей подобные, и будет строка ввода, поддерживающая все фичи GNU readline (поиск по истории, дополнение ит.д.);
— Если поставить пробел перед командой, она не осядет в .bash_history;
— ssh remote_host_name run_command запускает неинтерактивный шелл через SSH, который выполнит run_command и закроется;
— ssh remote_host_name bash открывает интерактивный шелл, команды в который вы вводите локально (нет лагов при нажатии клавиш);
— ssh -R открывает на удалённом хосте порт, который будет пробрасываться через SSH до локальной машины;
— ssh -L открывает на локальной машине порт, который будет пробрасываться через SSH до удалённой машины;
— ssh -D даёт вам SOCKS прокси;
… и т.д., имя им легионTiberiumk
21.08.2017 16:18Про pv есть в статье, правда там не объяснили, что работает только в тех командах, где есть вызов pipe
drmtmych
21.08.2017 16:13+3А как же навигация по командной строке:
Ctrl+b/Ctrl+f для перемещения на одну букву
Ctrl+a/Ctrl+e для перемещения в начало/конец строки
Ctrl+w — удаление одного слова
Ctrl+u — удаление всех символов слева от курсора
Ctrl+k — удаление символов справа от курсораkez
21.08.2017 16:36В строгом смысле поддерживается большинство emacs'совских комбинаций клавиш (без префикса)
vagonovozhaty
21.08.2017 16:16+19Люблю такие статьи тем, что в комментариях будет намного больше полезного, чем в самой статье.
Sirikid
21.08.2017 16:45+1Вызвав команду ls, или что-нибудь ещё, выводящее данные на экран, можно столкнуться с длинными списками, для просмотра которых требуется продолжительный скроллинг.
Кажется здесь забыли написать про пейджеры.
То, что выводится на экран, легко можно организовать в виде таблицы с помощью команды column -t. Например:
/etc/passwd
гораздо лучше будет выглядеть с опцией-s :
Kylin
21.08.2017 16:47+1Комбинация клавиш Ctrl + U убирает из строки всё то, что уже в неё введено.
Ага, а Ctrl + Y снова вставляет строку, аналог Ctrl + X / Ctrl +V в винде. Удобно если вспомнил что перед одной командой надо ввести другую, а заново набирать лень и к мышке тянутся тоже :)
eov
21.08.2017 16:55Можно мои 5 копеек?
- В команде "more file.txt" можно перемещаться вперед и НАЗАД кнопками f (forward) и b (backward). Ровно так же это делается и в man. Кнопка "v" приводит к тому, что файл передается редактору vi на редактирование. Если в режиме vi дать "<ESC> set nu", то уже vi пронумерует строки. Выход из vi — "<ESC> q".
- Кнопка / позволяет иcкать в more и в vi
- Команда "gunzip -c file.tar.gz | tar xvf -" позволяет распаковать одной строкой tar.gz архив (есть и другой метод, но мне этот более понятен). По сути gunzip -c вываливает результат в stdout, а символ "-" после пайпа вбирает в себя вывод из stdout в свой stdin.
- Что такое "su user" (если без user, то в root-а) знают все, но уверен, что не все знают, что "su — user" переводит в user-а со всеми переменными окружения этого пользователя.
- Все знают, что "cd" без параметров приводит к тому, что директория меняется на "home" (cd $home). А если сделать "cd ~/dir1", то получается "cd $home/dir1".
- Команда "ls -1 | wc -l" выдаст количество файлов и папок в директории. Если дать "ls -1d | wc -l", то количество папок. Если дать "ls -1f | wc -l", то количество только файлов.
- Команда "ll" — это аналог "ls -l" (во многих unix-ах). Если это не так, то всегда можно сделать alias.
- Комбинация "<CTRL> u" — убирает все символы левее курсора
- Комбинация "<CTRL> a" переводят курсор в начало строки
- Комбинация "<CTRL> e" переводят курсор в конец строки
Пункты 8-10 работают и в vi.
varnav
21.08.2017 17:153. Достаточно же tar xf filename.tar.gz
shurutov
22.08.2017 11:00- это только с GNU-сным таром;
- tar xzf filename.tar.gz
без "z" tar выдаст ошибку. - tar xjf filename.tar.bz2
varnav
22.08.2017 11:22Я попробовал tar xf без дополнительных букв в Ubuntu 16.04 и CentOS 7.3 — работает без ошибок. Возможно какие-то старые и экзотические оси требуют отдельного указания формата архива и не могут его определить самостоятельно, но я с такими видимо не работаю.
eov
21.08.2017 17:34Забыл сказать, что для п.3 исходный tar.gz не меняется (не распаковывается просто в tar).
shurutov
22.08.2017 11:06- Это не аналог, это именно предопределённый алиас в некоторых дистрибутивах/системах. Проверяется элементарно — вызовом команды alias
eov
22.08.2017 11:21Да, может быть. Если первый вызов ll не давал результата, а нужно что-то делать с расчетным временем более 5-10 минут, то вкручивал alias.
sabio
21.08.2017 17:25Если забыли при вводе команды добавить pv, то для большинства базовых команд (cp, mv, dd, tar, gzip и пр.) поможет progress
https://github.com/Xfennec/progress
eov
21.08.2017 17:26Может какой-нибудь ztar?
Я для себя выбрал вариант, который всегда везде (емли есть gunzip, конечно).
Fragster
21.08.2017 18:46+2cat /dev/urandom > /dev/null у меня загружает процессор примерно на 30%, для полной нагрузки есть stress -с numcores
Fen1kz
21.08.2017 18:51Надеемся, некоторых из тех десяти приёмов работы в командной строке Linux, которыми мы хотим с вами поделиться, попадут в ваш личный список полезных команд.
№9. Стресс-тест батареи ноутбука
Ну как так-то…
$ cat /dev/urandom > /dev/null
JavaJesus
21.08.2017 19:21-4Уже шутили про очень полезную команду rm -rf /? Пробовать обязательно всем. Лучше на проде
hdfan2
22.08.2017 09:30-2Кстати, есть такая реальная проблема — многие программы создают временные файлы с именем "~", которые со временем начинают забивать диск. Поэтому иногда рекомендуется выполнять команду «rm -rf ~», чтобы удалить такие файлы во всех подкаталогах.
tsabir
21.08.2017 20:28-1Иногда нужно запустить команду с определенными переменными окружения, можно сделать это одной строкой:
$ JAVA_HOME=/java/home ./run.sh
Daniyar94
21.08.2017 20:56От себя добавлю:
1.
$ pushd <some_dir> #добавляет директорию в стэк
$ popd #переносит вас в ту директорию удаляя ее из стэка
2.
$ history
999 pwd
1000 exit
1001 history
$ !999 #Выполняет команду из истории
/home/daniyar94
BerliozNSK
22.08.2017 08:04pushd и popd вообще выручают, когда надо копаться в конфигах разных программ
El_corona
21.08.2017 22:46мой путь начинающего линуксоида стал значительно менее тернист после того, как я узнал об apropos :)
AVX
21.08.2017 23:23Стопицот раз уже про одно и то же. ИМХО, кому работать реально в терминале нужно будет — найдёт намного более продвинутую и полную статью (их на хабре достаточно) или даже man'ы прочитает.
Я бы вот с бОльшим удовольствием почитал о графических утилитах/командах/вывозах функций ОС и оболочек, заметно повышающих дружелюбность скриптов к пользователю — намного удобнее ткнуть мышкой в файлик скрипта, выбрать что нужно, и получить в нормальном окне результат, и ещё прогресс видеть. Это я не про админов, а про обычных пользователей домашних ПК под линуксом, которые на 90% используют КДЕ, Гном или что-то ещё (реже). Вот например, прогресс-бар в КДЕ:
kdialog --progressbar "Reading files" $files_count
Вот диалог открытия папки в КДЕ:
folder="`kdialog --getexistingdirectory ~`"
Диалог с кнопками:
kdialog files:start --yesnocancel "check files" --yes-label "save md5" --no-label "check md5"
Нормальных обзорных статей по такого рода возможностям особо-то нет, а хотелось бы.
mSnus
22.08.2017 03:41Помнится, мы ещё под DOS-ом писали резидентные менюшки, которые по F2 всплывали везде, где надо, и содержали в себе нужные шорткаты, чтобы их не запоминать, и не выстрелить себе в ногу случайно (особенно на вторые сутки без сна в 5 утра)). F2 — потому что в VC тоже было неплохое пользовательское меню по этой кнопке.
То есть 20 лет назад под DOS это было, а сейчас под *nix надо держать в голове параметры какого-то pbzip2, а чтобы показать список последних команд надо что-то шаманить… Что стоило за это время улучшить bash или просто сделать что-то получше? У того же абсолютно инопланетного vi все же появились человеческие альтернативы типа nano…
kovserg
22.08.2017 09:33Это классический метод взаимодействия с компьютером и он никуда не делся. Он показал свою эффективность и работает очень уверенно ( cli в cisco, shell в linux ). Такое взаимодействие позволяет быстро комбинировать простые программы и получать результат. Графический интерфейс до сих пор не дорос до подобного.
Держать в голове параметры не надо у всех утилит есть справка
pbzip2 --help
man pbzip2
info pbzip2
…
bash-completion
«vi имеет два режима в одном он пищит в другом всё портит»
на основе vi сделан vim — один из самых эффективных редакторовmSnus
23.08.2017 17:49Между текстовым режимом и графическом есть ещё много градаций. Эффективность у чисто текстового ввода по сравнению с текстом+менюшки для шорткатов сильно ниже, вероятность ошибок у чисто текста — сильно больше. Мне кажется, это очевидно.
htop удобнее чем просто top, а top удобное, чем вывод по строкам (как в ping, например). Текстовые интерфейсы давно эволюционировали, но наследие сильнО ))
evgenWebm
22.08.2017 20:53Полезно. Спасибо.
P.S. Сегодня работал за консолью в винде. После винды, консоль линуха, просто шедевром кажется. Сделано людьми, для людей. В винде же… ад и страх cmdVitP
24.08.2017 00:06Пробовали Cygwin?
evgenWebm
24.08.2017 00:49Он сможет помочь мне вот с такими конструкциями?
sc sdset Spooler «D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2133228432-2794320136-1823075350-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)»
…
DrAndyHunter
23.08.2017 15:29Хотел бы добавить, что по введенной команде удобно перемещаться назад или вперед по целым словам, нажимая
илиCtrl + >
Ctrl + <
VitP
24.08.2017 00:07Это работает по дефолту? У меня вместо влево вставляется 5D, а вместо вправо 5C.
ashumkin
24.08.2017 12:19+1все перемещения по тексту и работа с историей — это функциональность библиотеки GNU readline
и работают не только в Bash, но и, естественно, во всех «консолях», которые её используют (irb, например)
красивые таблички/cheat sheets — в гугле по запросу, хотя то же самое описано по приведённой выше ссылке
mikkisse
Спасибо за статью! Когда-то давно открыл для себя Ctrl + R. Это чертовски удобная вещь.
ice2heart
Можно в .inputrc добавить
И можно будет искать по истории, просто введя часть команды и нажав стрелку вверх. (вниз тоже работает для поиска по истории)
alcyone
И в /etc/inputrc для system-wide. Очень удобно дистрибьютить менеджерами конфигураций.
apurey
Я перенял это для себя из zsh на FreeBSD
VolCh
Не все, кстати, знают, что начав что-то набирать ("префикс" типа sudo ) повторным нажатием можно "путешествовать" по истории вверх
MInner
С тех пор как узнал, все время пользуюсь сочетанием Alt+. для вставки «последнего аргумента» предыдущих вызовов. А Alt-Shift-3 (или Alt-#) «комментирует и запускает» текущую команду — удобно, когда на середине строки понял, что до этого было нужно ввести что-то еще, и этим можно текущую строки за-stash-ить. А чтобы быстро туда-сюда бегать вперед назад на ноутбуке или «стереть все перед текущим положением курсора» (например, чтобы использовать те же аргументы), удобно использовать Ctrl-U и Ctrl-E. А еще добавил себе set completion-ignore-case on в ~/.inputrc для case-insensitive автодополнения путей (неудобно бывает вводить странные названия папок, все мои папки в lower case'e). А еще так " bind '"\e," menu-complete' " можно включить zsh-like автодоплнение, чтобы по дополнялся по другой клавише «первый совпавший файл» вместо «если несколько опций, то показывать все» — удобно, когда файлов много, у всех похожие префиксы, а тебе нужен хоть какой-то для того, чтобы написать комманду. Ну и просто удобно: for f in ~/.bashrc.d/*; source $f done.