Как стать автором
Обновить

20 приёмов работы в командной строке Linux, которые сэкономят уйму времени

Время на прочтение 9 мин
Количество просмотров 231K
Всего голосов 82: ↑46 и ↓36 +10
Комментарии 87

Комментарии 87

18. Очистка содержимого файла без удаления самого файла

для этих целей я использую «echo > filename»

Если вы хотите очистить содержимое текстового файла, не удаляя сам файл, можете использовать следующую команду:

filename

я такой команды в CentOS 6 и 7 не нашел.

Лайфхак
: > filename
Исправили, спасибо.
Проблема с echo заключается в том, что полученный файл будет не пустым. Нужно либо писать echo -n >filename (linux) либо что-то вроде echo -e '\e' >filename, если у вас не bash, и просто :>filename в баше. На FreeBSD есть отдельная команда truncate, вроде как
cat > filename
Ctrl + D
18. Очистка содержимого файла без удаления самого файла

для этих целей я использую «echo > filename»


Продвинутые админы используют:

truncate -s 0 filename
truncate --size 0 filename

Для очистки больших файлов необходимо использовать truncate.
Я делаю проще «cat /dev/null > filename»
можно даже без echo, просто > filename
12. Повторное использование последнего элемента из предыдущей команды с помощью !$

Еще можно нажатие Alt +. (точка)

18. Очистка содержимого файла без удаления самого файла

Можно просто
>filename
yes |

выводит y, но выводить можно всё что угодно, например:
yes yes |

yes n |

ll — это не команда, а алиас к ls -l. Чуть больше рассказать про алиасы было бы многократно полезнее, чем рассказать про ll, который не предустановлен во многих дистрибутивах.

Плюсанул бы, да не умею… Это чуть ли не первый урок от MagPi в книге Bash Essentials — упростим себе жизнь, раскомментировав этот алиас в .bashrc. А ещё доступен аж целый la!
И даже l
все-таки стоило назвать статью 20 приемов… для самых новичков.

Тоже ожидал увидеть что-то новое, а на самом деле компиляция элементарных приемов, которым уже 20+ лет, и которые бесчисленное количество раз тиражировались начиная с Linux HOWTOs (кто еще помнит такие) и первых Linux журналов.

Попробуйте посмотреть новое здесь
Причем с грубыми ошибками в статье!
Интересно, сколько раз тут эти «20 мега приёмов» уже повторяют за все эти годы? Раз 20, не меньше, наверное.

Когда выдают экономию в один-два символа в команде cd за прием, который сэкономит уйму времени — мне хочется плакать. Вот подстановка имени файла по табу экономит много больше усилий и это реально качественный скачок на иной уровень.

Автор, где хардкор? Ну и часть советов вообще скорее вредные, например про!!! — очень частый паттерн это писать sudo !!, но вы при этом не видите, какую команду будете исполнять, и злоупотребление этой командой может привестм к печальным последствиям. Ну и не слова про fish, тоже обидно.
НЛО прилетело и опубликовало эту надпись здесь
тогда уж проще просто нажать: вверх ->ctrl+a и добавить sudo. но это как по мне.
cd ~


Потому что это указание на домашнюю папку пользователя.
~ без имени пользователя = текущий пользователь.
А вот cd ~user1 — зайти в домашнюю папку user1, например /home/user1 (или что у него прописано в /etc/passwd)
«В подобной ситуации полезным окажется разделитель команд; (точка с запятой). При таком подходе вы можете ввести несколько команд в одной строке. При этом, в отличие от обычного ввода команд, для выполнения следующей команды не надо ждать завершения предыдущей.
command_1; command_2; command_3»


Неверно. команды будут выполняться последовательно, после завершения предыдущей.
Они же не в фоне запускаются (& в конце)

НЛО прилетело и опубликовало эту надпись здесь
Ну в цитате указано, что не для ввода, а для «выполнения следующей команды», вроде как однозначно…
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Нужно просто ещё раз Ctrl+R нажать и подставится предыдущее вхождение.
"\e[A":history-search-backward
"\e[B":history-search-forward


в .inputrc для bash
fzf же!
Скачать и добавить строчку в .bashrc:
[ -f ~/.fzf.bash ] && source ~/.fzf.bash
Для пункта №9. Логи удобно будет просмтривать вот так:

tail -f /var/log/file.log | ccze -A
apt-get moo

как про это могли забыть?
:~$ telnet towel.blinkenlights.nl
Как всегда комментарии полезней самой статьи

А ещё, если вы делаете tail -f ... | grep onething | awk '{print $1}', то по умолчанию буферизация будет блочная у grep и вы будете видеть результаты большой задержкой. Чтобы всё же вернуть построчную буферизацию, нужно указать grep дополнительный --line-buffered:


tail -f ... | grep --line-buffered onething | awk '{print $1}'

Не все так просто с завершением программ
$ python
#тычем CTRL+C
>>> 
KeyboardInterrupt
>>> 
KeyboardInterrupt
#CTRL+D
$
$ bc
#тычем CTRL+C
(interrupt) use quit to exit.
^C
(interrupt) use quit to exit.
^C
(interrupt) use quit to exit.
^C
(interrupt) use quit to exit.
^C
quit
$

И это не единственные примеры, насколько я знаю.
НЛО прилетело и опубликовало эту надпись здесь

Ага, из telnet так вообще надо выходить путем ввода Ctrl+] и только потом quit :). А из SSH ещё круче: ~. (тильда точка)
Причём если вы подключились по SSH, а оттуда ещё по SSH и хотите завершить вложенный SSH, то надо вводить ~~.
Если подключились 2 раза по SSH, то ~~~~. и так далее :).

НЛО прилетело и опубликовало эту надпись здесь

Речь про зависший SSH, когда хост по какой-то причине не реагирует на ввод (Ctrl+D обрабатывается удаленной стороной).

НЛО прилетело и опубликовало эту надпись здесь
rsh / remsh спасает
Про ssh: если совсем точно, то <enter>~.
Если в момент пропадания связи набирались символы, то без enter-а не выйдет

Да, возможно вы правы. Лично для меня на самом деле важнее тот факт, что это вообще можно сделать, и в man ssh написано, как именно. Потому что мне кажется, что многие просто вкладку закрывают и всё.

А exit не спасает?
Если вы уже подключились — не факт, что на той стороне exit что-то означает =)
У питона свой дзен. Есть только один правильный способ сделать это, и это sys.exit(shota)..
Причин тому много и самая очевидная — многопоточность скрипт, а потоки с в неизвестном месте обрывать ну очень плохая идея.
Собственно суть. Ничто не мешает устроить свой собственный дзен
11. Использование команды less для чтения файлов

Протестировал только что, в отличие от more после нажатия q выведенный кусок файла пропадает из консоли. More удобнее, можно просто прокрутить терминал назад и снова увидеть нужный кусок файла. Такое бывает нужно.
Конечно, less позволяет сразу редактировать, но если в дистре есть less то есть и nano или mcedit которые для редактирования удобнее.
15. Копирование и вставка в терминале Linux

Более того, можно и enter скопировать, сместив во время выделения курсор в начало следующей строки.
less позволяет ПРОСОТ бегать назад, и прокручивать нужно не терминал, а сам текст в less.
Less также позволяет выполнять поиск назад, а не только вперед, фильтр строк и многое другое.
А more — просто постраничный вывод вперед, с возможностью поиска только вперед. И с автоматическим выходом по окончании файла

А ещё в less можно уже после открытия файла выключить word-wrap путем нажатия -S<Enter> (минус S, и потом Enter). Позволяет удобно просматривать
логи с длинными строками.

Если терминал «испортился» и показывает странные символы, то его зачастую можно починить, набрав <Enter>reset<Enter> (на самом деле просто выполнить команду reset) — у терминала на самом деле есть 2 «раскладки» и это использовалось задолго до изобретения UTF-8 для того, чтобы рисовать псевдографику. Команда reset сбрасывает терминал близко к оригинальным настройкам и зачастую может «починить» терминал, который «сошел с ума».

не только раскладки. Есть еще просто ESC-последовательности, которые управляют цветом. То есть сделав cat какого-нить бинарника, можно оказаться в ситуации, когда печатаешь черным по черному, или вырвиглазным мигающим по ярко красному, с шириной экрана 10 символов.
Тоже reset спасает.
Вставить — Shift+Insert (gnome-terminal)
Еще очень полезная утилита — parallel
Честно говоря, никогда не понимал, как утилита на Perl может помогать обрабатывать данные быстрее за счет параллелизации. Xargs на больших объёмах (иначе зачем вам использовать параллельную обработку) должен быть значительно быстрее, я не прав?
Суть не в быстрее, а в «параллельно». Нужно слить 100+ страниц для теста по базе урлов, или прогнать моделирование на 100+ входных данных...,
то вместо того, чтобы вручную что-то придумывать, просто запускаем скрипт через parallel.
НЛО прилетело и опубликовало эту надпись здесь
0. Нужен установленный bash-complection. Который частенько отсутствует на ВДСках, разворачиваемых из контейнеров.
*completion
с помощью комбинации клавиш Ctrl + A можно перейти в начало строки, а с помощью комбинации Ctrl + E — в конец.

да, удобная вещь, когда в Putty (в mc) Home и End не работают…

Не поверите, на некоторых клавиатурах таких кнопок вообще нет :). И pgup/pgdown тоже.

А вместо tail -f filename.ext можно использовать tailf filename.ext
Когда надо вспомнить как сделать распространенное действие с какой либо утилитой командной строки, очень помогает cheat: github.com/chrisallenlane/cheat
Если команда выполняется на переднем плане и вы хотите из неё выйти, можете нажать клавиши Ctrl + C для того, чтобы её остановить.

Ctrl-C отправляет SIGINT сигнал, который вызывает завершение процесса.
Ctrl-Z отправляет SIGTSTP сигнал, который приостанавливает выполнение процесса. Продолжить выполнение можно командой fg (от foreground)

… и bg (background), чтобы продолжить выполнение в фоне.

или kill -n 18
jobs — узнать список таких задач, «поставленных на паузу» или отправленных в бэкграунд.
14. Использование псевдонимов для исправления ошибок ввода


Cразу вспомнил забавную утилиту thefuck

C ней было бы так:

$ gerp
zsh: command not found: gerp

$ fuck
grep [enter/↑/↓/ctrl+c]
Это прекрасно!

20 приёмов работы в командной строке Linux bash, которые сэкономят уйму времени.
Или не сэкономят. Все зависит от того, что за работа будет делаться и в каком окружении. Иногда проще открыть еще одну вкладку в терминале — чтобы не экономить символы в команде cd. Иногда проще запустить файл-менеджер, чтобы не продираться с помощью tab. Иногда проще закрыть терминал вместе с зависшей сессией (2 раза в год бывает такое), чем вспоминать заклинание для ssh.

Есть еще одна фишка: Можно использовать tailf вместо tail -f
Представьте себе, что хотите собрать код, а затем, если сборка оказалась успешной, вызвать make?

Помоему, данная последовательность действий ничего полезного из себя не представляет. Второй пункт, скорее всего, нужно заменить на что-то типа "запустить тесты".


Или, может, под "сборкой проекта" вы подразумевали процесс генерации Makefile'а?

в чём состоит тонкость использования команды для вывода содержимого директории. Все знают, что для этой цели служит команда ls -l.

А как же dir?
Еще screen иногда очень сильно выручает (в частности при обрыве соединения).
tmux вроде поудобнее будет)
Чем?
Много чем. у tmux-а только одно неудобство — он недоступен из коробки, нужно ставить отдельно.
А так — разделение на окна, кроме виртуальных вкладок, и поддержка командной строки, что позволяет автоматизировать переход в разные режимы, плюс внятный статус бар, плюс отсутствие глюков с терминалом — этого уже более чем достаточно.
Спасибо за наводку. Будем посмотреть :)
По комментариям ещё одну такую же статью можно написать:)
Меня народ за watch благодарит.
Из последнего: здорово экономят время команды вида
for i in 1 2 3; do ssh root@cassandra$i.example.com /opt/cassandra/bin/nodetool status; done

Для копирования файлов, проверки статуса софта по нескольким серверам отлично подходят.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий