В сети можно встретить много советов по эффективной работе в консоли. В большинстве таких статей авторы рассказывают про банальности типа "выучите горячие клавиши" или "sudo !!
запустит последнюю команду под sudo". Я же расскажу о том, что делать, когда вы уже выучили горячие клавиши и знаете про sudo !!
.
Терминал должен запускаться мгновенно
Сколько времени вам нужно, чтобы запустить терминал? А ещё один? Долгое время мой терминал запускался сочетанием Ctrl+Alt+T и я думал, что это быстро. Но когда я переехал с Openbox на i3, то стал запускать терминал через Win+Enter, это сочетание было в конфиге по умолчанию. И знаете что? Я больше не считаю, что Ctrl+Alt+T — это быстро.
Разумеется, прикол не в выигрыше миллисекунд, а в том, что вы открываете терминал на уровне рефлексов, совершенно не замечая этого.
Если вы часто работаете в терминале, но для его запуска тянетесь к мышке, то попробуйте настроить удобную горячую клавишу. Я уверен, вам понравится.
Zsh вместо Bash
Это холиварная тема, знаю. Zsh стоит поставить хотя бы ради трёх фич: продвинутый автокомплит, коррекция опечаток и множественный pathname completition: когда один Tab превращает /u/s/d
в /usr/share/doc
. Arch Linux уже давно перешёл на zsh в своём установочном диске. Я надеюсь что однажды zsh станет дефолтным шеллом в Ubuntu. Это будет исторический момент.
Начать использовать zsh вообще не сложно. Установите его через менеджер пакетов и возьмите какой-нибудь готовый конфиг. Я рекомендую конфиг, который используется в Arch Linux:
wget -O ~/.zshrc https://git.grml.org/f/grml-etc-core/etc/zsh/zshrc
Осталось только поменять "шелл по-умолчанию" на zsh и перелогиниться.
chsh -s $(which zsh)
Всё, продолжайте работать как будто ничего не произошло.
Каким должен быть shell prompt
Shell prompt (приглашение командной строки) — это тот маленький текст, который выводится в терминале перед вашей командой. Его нужно настроить под свой характер работы. Воспринимайте его как приборную панель автомобиля. Поместите туда полезную информацию, пусть он будет помогать ориентироваться. Сделайте его удобным, особенно если видите его каждый день!
Shell prompt должен показывать текущий каталог шелла. Если текущий каталог не выводится в shell prompt, вам придётся держать его в голове и периодически проверять командой pwd
. Не надо так. Держите в голове более важные вещи и не тратьте время на команду pwd
.
Если вы периодически переключаетесь со своего пользователя на рута, вам нужна индикация текущего пользователя. Зачастую важно не конкретное имя пользователя, а его статус (обычный или рут). Проще всего это сделать цветом: красный shell prompt у рута, зелёный у своего пользователя. Так вы ни за что не спутаете рутовый шелл с обычным.
Если вы подключаетесь к серверам по ssh, то вам нужно как-то отличать свой локальный шелл от серверного. Для этого shell prompt должен содержать имя хоста, а ещё лучше — индикатор ssh-соединения.
Shell prompt умеет показывать код возврата последней команды. Напомню, что нулевой код возврата означает, что команда завершилась успешно, ненулевой — команда завершилась неуспешно. Код возврата последней команды можно узнать командой echo $?
, но набирать это всё на клавиатуре слишком долго. Пусть лучше shell prompt сообщит, если команда завершилась неуспешно.
Если вы работаете с git-репозиториями, то будет нелишним выводить в shell prompt статус репозитория: текущую ветку и состояние рабочей директории. Так вы сэкономите время на командах git status
и git branch
и не ошибётесь веткой при коммите.
Кто-то добавляет в свой shell prompt часы или имя виртуального терминала (tty), или какие-то произвольные закорючки. Это всё лишнее. Лучше оставить побольше места для команд.
Мой shell prompt в разных условиях выглядит так:
На скриншоте видно, что схожую задачу выполняет заголовок окна терминала. Это тоже кусок приборной панели и его тоже можно настроить.
Как это всё реализовать в своём .zshrc
? За левый prompt отвечает переменная PROMPT
, за правый — RPROMPT
. Определить статус пользователя (обычный или рут) поможет переменная EUID, а наличие ssh-соединения — SSH_CLIENT или SSH2_CLIENT. Получаем такую заготовку:
if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then
if [[ $EUID == 0 ]]; then
PROMPT=...
else
PROMPT=...
fi
else # not SSH
if [[ $EUID == 0 ]]; then
PROMPT=...
else
PROMPT=...
fi
fi
Я специально не указываю готовый к копипасту код, потому что конкретная реализация — это дело вкуса. Если же вы не хотите заморачиваться и мой скриншот не вызывает у вас отвращения, можете взять конфиг с гитхаба.
Резюме:
- Необходимый минимум — это текущий каталог.
- Рутовый шелл должен быть хорошо заметен.
- Имя пользователя не несёт полезной нагрузки, если вы всегда сидите под одним пользователем.
- Хостнэйм полезен, если вы подключаетесь к серверам по SSH. Не обязателен, если всегда работаете на одной машине.
- Неуспешное завершение последней команды полезно видеть сразу.
- Статус git-репозитория экономит время на командах
git status
иgit branch
и является дополнительной защитой от дурака.
Активное использование истории команд
Бо?льшую часть команд в своей жизни вы вводите больше одного раза, а значит было бы удобно выдёргивать их из истории вместо того, чтобы набирать заново. Все современные шеллы умеют запоминать историю команд и предоставляют несколько способов поиска по этой истории.
Возможно вы уже умеете копаться в истории сочетанием Ctrl+R. У него есть два существенных недостатка:
- Чтобы начать поиск, поле ввода должно быть пустым. Т.е. в случае "начал набирать команду — вспомнил про поиск" придётся стереть начатое, нажать Ctrl+R и повторить ввод. Это очень долго.
- Поиск "вперёд" по умолчанию не работает, т.к. Ctrl+S останавливает терминал.
Как работает самый быстрый и удобный поиск:
- вы начинаете набирать команду,
- вы вспоминаете про поиск,
- вы нажимаете хоткей и шелл предлагает команды из истории, которые начинались точно так же.
Например, вы хотите синхронизировать некий локальный каталог с удалённым с помощью rsync
. Вы уже делали это пару часов назад и хотите вытащить команду из истории. Набираете rsync
, один-два раза нажимате некую комбинацию, и вот заветная команда готова к запуску. Вам не надо предварительно включать режим поиска по истории, shell prompt не меняется на (reverse-i-search)':
, ничего никуда не прыгает. Вы просто перебираете команды из истории. Так же, как и стрелочками ^v вы перебираете ранее введённые команды, только с фильтром по началу комады. Это чертовски удобно и экономит уйму времени.
В оболочках fish и ipython такой поиск уже назначен на стрелочки. Я думаю что многие перешли на fish только ради такого поведения стрелочек.
В bash и zsh по-умолчанию такой поиск не работает, его надо включить руками. Я настроил PgUp для поиска назад и PgDown для поиска вперёд. Далековато до них тянуться, но я уже привык. Возможно в будущем переназначу на что-нибудь поближе, например Ctrl+P и Ctrl+N.
Для bash надо добавить пару строк в /etc/inputrc
или ~/.inputrc
:
"\e[5~": history-search-backward
"\e[6~": history-search-forward
Если вы взяли готовый zshrc
, то там поиск скорее всего уже назначен на PgUp и PgDown. Если нет, то добавьте в ~/.zshrc
bindkey "^[[5~" history-beginning-search-backward # pg up
bindkey "^[[6~" history-beginning-search-forward # pg down
Любопытно, что со временем я стал писать команды из расчёта, что позже буду поднимать их из истории. Вот несколько приёмов:
Объединение команд, которые всегда выполняются друг за другом
ip link set eth1 up && dhclient eth1
mkdir /tmp/t && mount /dev/sdb1 /tmp/t
Абсолютные пути вместо относительных позволяют запускать команду, находясь в любом каталоге:
vim ~/.ssh/config
вместо vim .ssh/config
, systemd-nspawn /home/chroot/stretch
вместо systemd-nspawn stretch
и т.д.
Подстановка по маске (wildcard) делает команды более универсальными. Обычно использую с chmod
и chown
.
chown root:root /var/www/*.sq && chmod 644 /var/www/*.sq
Горячие клавиши
Перечислю необходимый минимум.
Alt+. — подставляет последний аргумент предыдущей команды. Также можно набрать последовательность !$
.
Ctrl+A, Ctrl+E — переход к началу и концу редактируемой команды соответственно.
Ctrl+U, Ctrl+Y — вырезать всё в буфер обмена, вставить из буфера. Выручает, когда печатаешь сложную команду, а потом понимаешь, что перед ней надо выполнить другую. Хм, куда бы припрятать текущий ввод? Вот сюда и припрятать.
Ctrl+W — стирает одно слово слева от курсора. Если зажать и удерживать, быстро очищает командную строку. По умолчанию текст не удаляется, а помещается в буфер (который для Ctrl+Y).
Ctrl+K — удаляет от курсора и до конца строки. Ctrl+A, Ctrl+K быстро очищает командную строку.
PgUp, PgDown, Ctrl+R — поиск по истории.
Ctrl+L — очистить терминал.
Отзывчивость клавиатуры
Расскажу про маленькую настройку, которая позволяет быстрее скроллить, перемещаться по тексту или стирать. Что мы делаем, когда хотим стереть что-то длинное? Зажимаем Backspace и смотрим как курсор бежит назад, забирая лишние буквы. Что при этом происходит? При нажатии Backspace стирается один символ, затем идёт небольшая задержка, затем срабатывает автоповтор: Backspace убирает символы один за другим, как будто по нему постоянно стучат.
Я рекомендую отрегулировать задержку и частоту работы автоповтора под скорость своих пальцев. Задержка перед срабатыванием автоповтора нужна когда вы хотите удалить только один символ — она даёт вам время отпустить клавишу. Слишком долгая задержка заставляет ждать автоповтора. Не настолько долго, чтобы раздражать, но достаточно, чтобы тормозить перенос мыслей из головы в компьютер. Чем выше частота повтора, тем быстрее стирается текст, и тем сложнее вовремя остановить этот процесс. Суть настройки заключается в поиске золотой середины.
Итак, волшебная команда:
xset r rate 190 20
190 — длительность задержки в миллисекундах,
20 — частота в количестве повторений в секунду.
Я рекомендую начать с этих значений и понемногу уменьшать задержку до появления ложных срабатываний, затем чуть-чуть вернуть назад. Если установить очень короткую задержку, то клавиатурой станет невозможно пользоваться. Придётся перезагружать X-сервер или компьютер целиком. Так что будьте аккуратнее.
Чтобы сохранить параметры, добавьте эту команду куда-нибудь в автостарт иксов.
Индикатор завершения процесса
Мне довольно часто приходится запускать долгие процессы: какой-нибудь жирный бэкап, копирование по сети, распаковку/запаковку архивов, сборку пакетов и т.д. Обычно я запускаю такой процесс, переключаюсь на другую задачу и периодически поглядываю не завершился ли мой долгий процесс. Бывает, что я сильно погружаюсь в работу и забываю о нём. Решение — добавить нотификацию завершения процесса, которая выведет меня из транса.
Для этого можно использовать разные средства: notify-send, dzen2, beep, aplay. Все они по-своему хороши, но не работают по ssh. Поэтому я использую terminal beep:
long-running-command; echo $'\a'
В кодировке ASCII есть символ 0x7, именуемый bell. Он предназначен для того, чтобы пищать PC-спикером. PC-спикер — это несовременно, он не везде есть, а ещё его не слышно в наушниках. Поэтому некоторые терминалы применяют так называемый visual bell. Я использую urxvt, и он делает visual bell включением флага urgency. Это когда окно сообщает вам, что оно требует внимания.
Вы можете прямо сейчас проверить как ваш терминал реагирует на символ bell:
sleep 3; echo $'\a'
Три секунды даётся, чтобы вы успели переключиться на другое окно, иначе может не сработать.
К сожалению, visual bell через urgency есть не во всех терминалах. Я проверил самые популярные.
терминал | visual bell через urgency |
---|---|
konsole | включается в настройках |
urxvt | есть |
xfce4-terminal | включается в настройках |
xterm | нет |
cool-retro-term | нет |
lxterminal | нет |
gnome-terminal | нет |
Писать echo $'\a'
слишком долго, поэтому я сделал алиас wake
.
Алиасы
Команды cp
, scp
и rm
всегда должны работать рекурсивно. Аргумент -r
— это просто дурное легаси! У cp
ещё можно найти оправдание:
cp * foodir
скопирует в foodir только файлы, а с ключом -r
подумает, что вы решили скопировать foodir в самого себя. Но как часто вам нужна эта фича?
У rm
и scp
вообще нет оправданий, они просто зануды! Похожая ситуация с ключом -p
у команды mkdir
. Так что смело добавляем в ~/.zshrc
alias cp='cp -r'
alias scp='scp -r'
alias rm='rm -r'
alias mkdir='mkdir -p'
Ух, как же я раньше без этого жил! Можно пойти ещё дальше и добавить -f
у rm
, но на свой страх и риск. Я пока себя сдерживаю.
Разные вариации ls
вы скорее всего уже используете, ведь это самые популярные алиасы.
alias ls='ls -F --color=auto'
alias la='ls -A --color=auto'
alias ll='ls -l --color=auto -h'
alias lla='ll -A --color=auto -h'
Ну и цветной grep намного приятнее бесцветного:
alias grep='grep --colour=auto'
Не забывайте, что алиасы не работают в скриптах! Там надо указывать все ключи.
Слепой метод печати
Как бы банально это ни было, но слепой десятипальцевый метод печати позволяет быстрее печатать. Поначалу будет тяжело, но со временем вы разгонетесь до невиданных ранее скоростей.
Осваивать слепой метод печати лучше всего на каникулах или в отпуске, когда вас никто не торопит. В процессе обучения ни в коем случае нельзя спешить. Ваша задача — запомнить где какая буква находится. Причём не столько мозгом, сколько мышцами. Лучше набирать медленно, но без ошибок, чем быстро с ошибками. Помните: мастера добиваются высоких скоростей не за счёт быстрых пальцев, а потому что не делают ошибок.
Не стоит поначалу увлекаться клавогонками. Психологически тяжело оставаться хладнокровным во время соревнований. Учитесь на тренажёрах. Хорошо, когда тренажёр предлагает слова, которые можно мысленно произнести. Я учился на онлайн-тренажёрах vse10 и typingstudy. Известный тренажёр "Соло на клавиатуре" мне показался бестолковым.
Начинать стоит с центрального ряда "фывапролджэ". Только после того, как вы запомните где какая клавиша расположена, стоит двигаться дальше. Только после этого.
Делайте перерывы. Давайте отдых мозгу и пальцам. Чувствуете, что посыпались ошибки — пора делать перерыв.
Сначала я освоил слепой метод печати на русском языке и прифигел от ускорения. Сейчас совершенствую навык в английской раскладке.
Комментарии (109)
farcaller
02.10.2018 18:51Странно что после
В оболочках fish и ipython такой поиск уже назначен на стрелочки. Я думаю что многие перешли на fish только ради такого поведения стрелочек.
не упомянуты zsh-autosuggestions и zsh-history-substring-search
laurvas Автор
02.10.2018 19:01Спасибо за ссылки. autosuggestions — это тема. Поиск произвольной подстроки в истории нужен намного реже, чем поиск с начала. Для него можно и Ctrl+R нажать (это про вторую ссылку).
farcaller
02.10.2018 19:26но как же стрелочки! /s
laurvas Автор
02.10.2018 19:46Разумеется, можно переопределить стрелочки, если очень хочется.
Для readline (bash):
"\e[A":history-search-backward
"\e[B":history-search-forward
Для zsh:
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-searchgitKroz
03.10.2018 09:11Разумеется, можно переопределить стрелочки, если очень хочется.
Для readline (bash):
"\e[A":history-search-backward
"\e[B":history-search-forward
Из коробки уже ж забиндено на PgUp/PgDown.
kt97679
02.10.2018 19:39Стоит упомянуть менеджеры консольных сессий: screen, tmux, byobu. Перегружать информацией PROMPT не стоит, гораздо удобнее использовать статусную строку менеджера сессий.
savostin
02.10.2018 19:42Да, кстати, как вы в Zsh без screen работаете?
* пардон, промахнулся, это автору.laurvas Автор
02.10.2018 19:57Эмм… А в чём подвох? Я использую screen исключительно как замену nohup, а тайлинг обеспечивается оконным менеджером i3. Мне не лень открыть ещё один терминал (вы уже знаете что это быстро) и повторно подключиться к серверу по ssh, если возникла такая необходимость.
savostin
02.10.2018 20:02У меня zsh под screen не работает никак.
Mac + iTerm -> ssh на Ubuntu -> zsh + screen
Похоже где-то screen меняет $TERM принудительно…
Без screen все отлично…laurvas Автор
02.10.2018 20:33Неплохо бы проверить каждое звено этой цепи, чтобы найти виновника.
- Попробовать другой терминал или Linux вместо Mac.
- Попробовать на другом сервере.
- Попробовать запустить bash под screen вместо zsh (
screen bash
). - Попробовать другой zshrc, например по ссылке из статьи.
laurvas Автор
02.10.2018 19:52Скриншот покажете? Согласен, PROMPT не стоит перегружать. В каком именно ключе стоит упомянуть менеджеры консольных сессий? Я много о чём не написал :)
kt97679
02.10.2018 20:30Вот хорошая статья на эту тему и со скриншотом: hackernoon.com/customizing-tmux-b3d2a5050207
Менеджер консольных сессий имхо удобнее использовать для работы на удаленных серверах, чем открывать новые коннекты в табах. Плюс при обрыве соединения сессия не теряется.
Amomum
02.10.2018 20:20+1А не появился ли случайно хороший аналог PuntoSwitcher'a? Собственно, интересует не автопереключение раскладки, а только возможность сменить раскладку последнего набранного слова.
Лично мне такая фича очень много времени экономит при наборе текста.rotor
02.10.2018 20:36+4у меня вот такая команда повешена на хоткей
xclip -selection clipboard -o | perl -CS -Mutf8 -pe "tr/\`&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/~QWERTYUIOP{}ASDFGHJKL;'ZXCVBNM,.\/ё?йцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ./ё?йцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ.\`&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/~QWERTYUIOP{}]ASDFGHJKL;'ZXCVBNM,./;" | xclip -selection clipboard -i
Заменяет "раскладку" текста в буфере обмена. в обе стороны
Daemonic
03.10.2018 17:26Короткий вариант (работает под MacOS):
fixlayout() {
en="qwertyuiop\[]asdfghjkl;'\zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>\@№%%^&*"
ru="йцукенгшщз\хъфывапролджэёячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ\ЭЁЯЧСМИТЬБЮ\"#$:,.;"
pbpaste | sed y=$en$ru=$ru$en= | pbcopy
}
ainoneko
02.10.2018 21:34xneur?
(Когда я его пробовал в последний раз, он был глючным: что-то автоматически переключал даже когда это было явно запрещено в настройках — но это было давно.)
streetturtle
02.10.2018 21:50+1По поводу алиасов, недавно задался вопросом какие команды я чаще всего использую, чтобы сдеалать им алиасы. В итоге написал вот эту команду, которая читает history, группирует по имени команды и показывает количество вызовов:
history | sed 's/^\s*[[:digit:]]\+\*\?\s*//g' | sort | uniq -c | sed 's/^\s*//g' | sort -k1 -n -r | head
В моём случае результат оказался интересный, топ 5 команд:
1158 ll 182 cd 152 mvn clean install 80 pwd 69 cd ..
к трём из которых в zsh уже есть алиасы о которых я не знал:
ll -> l cd .. -> .. cd -> ~
sabio
03.10.2018 00:03mvn clean install
— это архаизм
Уmvn verify
перед ним сплошные плюсы: набирать короче, работает быстрее, локальный репозиторий SNAPSHOT-ами почём зря не забивает
Ещё про Maven: https://habr.com/company/jugru/blog/424505/
ZyXI
03.10.2018 01:27Зачем хранить в истории дубликаты команд? Если не ошибаюсь, то это не даст нормально использовать поиск по началу строки. И в любом случае ограничит число различных команд, которые вы могли бы хранить в истории. И всё это с единственным сомнительным плюсом возможности получить статистику использования, что можно организовать отдельно, не замусоривая историю.
PS: Для zsh нужно использовать не
history
, аhistory -- $[-2**31]
; вместо$[-2**31]
нужно использовать отрицательное число по модулю не менее длины истории (но влезающее в (?)int
поскольку наименьшее число на моей 64?битной системе —$[2**63]
, только его использование вызывает ошибку как если бы я использовал положительное число). (Обычно можно просто написатьhistory -- -10000000
и не парится.) Простоhistory
по?умолчанию выдаст только последние несколько команд (у меня 16).
kost
03.10.2018 07:35к трём из которых в zsh уже есть алиасы о которых я не знал:
ll -> l
В zsh по-умолчанию:
ll -> ls -l l -> ls -la
ZyXI
03.10.2018 11:41В zsh по?умолчанию нет никаких alias, кроме
run-help=man
иwhich-command=whence
. Можете проверить сzsh -f
. Вы говорите либо про какие?то системные файлы настроек, либо про сборку вроде oh-my-zsh.
Zenker
03.10.2018 03:53Для удобного поиска по истории команд, файлам и директориям(и перехода по ним), можно использовать FZF(Arch Wiki). А для ускорения самого поиска — прикрутить к этому ещё the_silver_searcher.
Пример из моего конфига:
export FZF_DEFAULT_COMMAND='ag --hidden --nocolor -g ""' export FZF_DEFAULT_OPTS=' --color fg:242,bg:236,hl:65,fg+:15,bg+:239,hl+:108 --color info:108,prompt:109,spinner:108,pointer:168,marker:168 ' export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" export FZF_ALT_C_COMMAND='tree -iafd'
nlykl
03.10.2018 15:08Да, FZF среди всех улучшателей консоли можно поставить на первое место.
Гифка для привлечения внимания:
vesper-bot
03.10.2018 07:26Давным-давно был рабочий метод ускорения печати на клавиатуре — реалтайм игры в MUD'ы, особенно PVP. Потом телнет-клиенты стали продвинутыми, и игра превратилась в «нажми кнопку — пошли целую команду», и метод себя изжил. Но было интересно, а ещё было потрясающее по мощности подкрепление успехам и неудачам — пронимало почти любого, кто в это играл.
Germanjon
03.10.2018 07:45Интересная статья, но позволю себе споры и комментарии в нескольких участках:
Терминал должен запускаться мгновенно
Для этих целей я юзаю Yakuake (для KDE). Есть аналог guake для GNOME. Терминал и не закрывается, он прячется вверху экрана и быстро вызывается по горячей клавише.
Если вы периодически переключаетесь со своего пользователя на рута, вам нужна индикация текущего пользователя
Спасает стандартное приглашение командной строки. Если последний символ $ — вы обычный пользователь, если # — root. Ну и, сидеть под root'ом грех, лучше использовать sudo (если совсем лень, то с NOPASSWD).
Неуспешное завершение последней команды полезно видеть сразу.
Насколько часто это нужно In real life? Если нужно запустить набор последовательных команд, их проще пускать через &&
Индикатор завершения процесса
Можно использовать конструкцию вида «команда; wall команда успешно завершилась»
laurvas Автор
03.10.2018 10:00+1Для этих целей я юзаю Yakuake (для KDE)
Ну, вы же всё равно согласны, что он должен открываться мгновенно :) Минус drop-down терминалов в том, что терминал будет всего один. Ну, может быть два. Но не пять (вкладки не считаем). Видимо вам для работы хватает. Я не критикую, это же дело вкуса.
Спасает стандартное приглашение командной строки.
У вас shell prompt не бесцветный случаем?
Сидеть под рутом или использовать sudo — холиварная тема. Ни в коем случае не хочу начинать спор, только приведу аргументы. Я сижу под рутом, потому что:
- Не встречал сильных аргументов в пользу sudo.
- Рутовые команды приходится писать часто.
- Лень набирать 5 лишних символов для каждой команды.
- Так «рутовые» команды попадают в свою историю, а не смешиваются с моей.
- Получаем полноценный автокомплит, а не урезанный.
- Хорошо различаю обычный и рутовый шелл, поэтому не промахиваюсь.
Давайте придумаем реальный сценарий, когда sudo спасёт вас. Мне в голову приходит толькоrm -rf /
. Но если человек в принципе готов запускать такую команду, то что ему помешает ввести эту команду под sudo?
Насколько часто это нужно In real life?
Хороший вопрос. Пожалуй, это зависит от специфики работы. Скрипт на bash может молча остановиться, если по ходу выполнения возникла ошибка. Без кода возврата вы не поймёте по какой причине он остановился.
Можно использовать конструкцию вида «команда; wall команда успешно завершилась»
Ценное замечание, спасибо!AgentSIB
03.10.2018 11:22А если так:
/usr/local/bin/wake.sh
#!/bin/sh _CODE=$1 echo $'\a' exit $_CODE
alias wake='/usr/local/bin/wake.sh $?'
Пример:
# ./test.sh ; echo $? 3 #./test.sh ; wake ; echo $? 3
PS. К тому же в скрипте можно указать условие, что если это X сессия, использовать notify-send или подобноеlaurvas Автор
03.10.2018 11:33Простите, я не совсем понял какую задачу вы решаете. Вы хотите сказать, что в моей конструкции
long-running-command; echo $'\a'
не будет грустного смайлика, еслиlong-running-command
завершится неудачно? Действительно, это упущение.ZyXI
03.10.2018 11:53+1Кстати, а почему «грустный смайлик», а не собственно код? Код завершения иногда предоставляет дополнительные данные: во?первых, у некоторых программ они задокументированы. Во?вторых, при завершении по (необработанному) сигналу код будет иметь определённое значение.
В?третьих, если только последняя команда из цепочки вида
a | b | c
завершилась с ошибкой, то код завершения будет ненулевым. Нужно показывать$pipestatus
(весь, если хотя бы одна программа завершилась с ошибкой), но пачка смайликов будет выглядеть как?то странно.laurvas Автор
03.10.2018 12:12Спасибо за замечание. Вы правы. Грустный смайлик у кого-то подглядел, мне идея понравилась. На практике конкретный код возврата не требовался. Главное — заметить, что что-то пошло не так.
В дефолтном конфиге Archlinux код возврата показывается цифрами, если он не нулевой.
AgentSIB
03.10.2018 11:57Мне просто понравилась идея и я решил ее для себя развить. К тому же это решает проблемы с грустным смайликом :)
./test.sh ; wake 'My Test Command'; echo $? 3
laurvas Автор
03.10.2018 12:06+1Красиво! Могу только предложить переписать
wake
как обёртку, чтобы запускать
wake ./test.sh
Имя команды, которая завершилась, он может определить сам как $(basename $1).
Germanjon
03.10.2018 13:01Минус drop-down терминалов в том, что терминал будет всего один. Ну, может быть два. Но не пять (вкладки не считаем)
При помощи вкладок (переименованных по желанию) запускаю много виртуальных терминалов. Принципиальных отличий от голой консоли не замечено.
У вас shell prompt не бесцветный случаем?
Из-за природной лени бесцветный.
Я сижу под рутом, потому что
В своей жизни я или как обычный пользователь и пользуюсь изредка sudo для разовых операций. Или работаю root-ом для чего-то сложного, после чего разлогиниваюсь.
Возможно, это тоже зависит от специфики работы.
Magn
03.10.2018 13:53Почему это вкладки не считаем? это очень удобно. Плюс Yakuake поддерживает разделение области на несколько терминалов, то есть в каждой вкладке у вас может быть несколько терминалов ( Случайный пример изинтернета https://onstartup.ru/wp-content/uploads/2018/05/yakuake-768x432.jpg ). Хоткеи на открытие, закрытие и переключение между вкладками и терминалами дополняют всё это до полного удобства и ускоряют процесс работы.
sasha1024
03.10.2018 17:13Что подразумевается под «сидеть под рутом»?
laurvas Автор
03.10.2018 21:54Иметь открытый терминал с рутовым шеллом. Поднять свой шелл до рутового можно командами
su
,sudo -s
,sudo su
.
Я не имел в виду запускать от рута X-сессию и всё остальное.sasha1024
04.10.2018 10:43Ясно. Просто суть с том, что в какой-то момент мы по-любому включаем рута: или при запуске X-сессии, или при запуске терминала, или потом
sudo -s
/sudo -i
— т.е. в какой-то момент включение рута происходит, и я пытался понять, про какой момент речь (Вы ответили). И ещё, извиняюсь, я неправильно прочитал ветку сообщений, мне почему-то показалось, что «сидеть под рутом или использовать sudo — холиварная тема» — это возражение к «спасает стандартное приглашение командной строки [# vs. $]», а не к «сидеть под root'ом грех, лучше использовать sudo» (уже понял, что неправильно прочитал).powerman
04.10.2018 13:38Суть не в том, что мы рано или поздно включаем рута, а в том, чтобы не выполнять от рута "случайных" команд. Для этого нужно во-первых всегда чётко осознавать что текущая команда выполняется от рута (что можно достигать разными способами — sudo, явная визуальная индикация что это рутовый шелл, отдельный хоткей для вызова рутового терминала, etc.), и во-вторых стараться не выполнять от рута то, что не требует рута (здесь только sudo спасает из-за лени).
Я тоже предпочитаю индикацию вместо sudo, но при этом нередко запускаю от рута man и т.п. — то, что можно было бы запустить и под юзером… вреда от этого пока не было, но по факту от рута запускается немного больше, чем необходимо.
shoorick
03.10.2018 22:45Я сижу под рутом, потому что
в отдельной вкладке терминала —
sudo bash
илиsudo mc
плюс отличающийся от обычного внешний вид. Работать — в других вкладках, переключаясь в рутовую только при необходимости.
artemisia_borealis
03.10.2018 22:51+1Давайте придумаем реальный сценарий, когда sudo спасёт вас. Мне в голову приходит только rm -rf /. Но если человек в принципе готов запускать такую команду, то что ему помешает ввести эту команду под sudo?
На самом деле это не сложно придумать. Например, рестрикты sudo/doas помогают ограничить действия других пользователей, в том числе пользователей-автоматов (типа позволить пользователю www одну-две команды «не от себя» или пользователю svn/git/hg, под которым обычно даже залогиниться нельзя, позволить исполнить post-commit hook). Но это конечно, не случай «сидеть под».
Но вот если вы работаете на нескольких терминалах локальных (в широком смысле: с локальных машин, которые физически быстро доступны) и на нескольких удалённых, то довольно легко ребутнуть или захалтить комп, к которому нет физического дуступа, или что-то там необратимо улучшить в файерволле. Тогда doas (sudo) с соответствующими правами/запретами ох как поможет.
А на локалхосте тоже по-моему ничего зазорного в root'е нет.Germanjon
04.10.2018 07:20То, что sudo ограничивают действия других пользователей — это понятно. Речь идёт об ограничении себя на локальной машинке.
sudo немного может спасти от неадекватных или ошибочных действий (типа, подумай ещё раз). В данном случае sudo действует как инкапсуляция в объектно-ориентированном программировании, «на всякий пожарный закрою прямой доступ к опасным функциям».
Хотя, в реальной жизни это не всегда помогает. Как-то вернулся домой жутко нетрезвым (не помню, что было между очередной рюмкой в кафе и следующим утром) — а потом обнаружилось, что установил на домашний компьютер другой дистрибутив и даже пароли не забыл.
artemisia_borealis
03.10.2018 22:31+2Ну и, сидеть под root'ом грех, лучше использовать sudo (если совсем лень, то с NOPASSWD).
Тогда уж doas. Автор sudo Todd C. Miller не возражал, когда его детище выпилили из системы три года назад. Пришедший ему на смену doas существенно легковесней и проще в настройках.
9660
03.10.2018 08:19+3Команды cp, scp и rm всегда должны работать рекурсивно. Аргумент -r — это просто дурное легаси!
Обычно подобное мнение несколько меняется когда грохнешь важное и сильно вложенное.laurvas Автор
03.10.2018 10:03А каким образом от ошибки спасает именно ключ
-r
? Вы любите делатьrm *
, чтобы удалить файлы в каталоге, который содержит подкаталоги?
9660
03.10.2018 10:06Да, удаление по маске, удаление каталога в котором оказался другой вложенный и тд…
laurvas Автор
03.10.2018 10:29удаление каталога в котором оказался другой вложенный
Без-r
у вас не получится это сделать.
и тд…
Какое именно? :)
По-моему безопаснее считать, чтоrm
относится к каталогам так же, как и к файлам. Поэтому я не стану делатьrm *
, чтобы удалить все файлы, но оставить каталоги. Если файлов настолько много, что перечислять их замучаешься, то я поступлю одним из следующих способов:
for i in *; do test -f $i && rm $i; done
find -maxdepth 1 -type f -delete
\rm *9660
03.10.2018 11:52Без -r у вас не получится это сделать.
О чем и речь. Предлагается же сделать такое поведение по умолчанию.
По-моему безопаснее считать, что rm относится к каталогам так же, как и к файлам.
Кто спорит. Просто удаляют рекурсивно нужное обычно не от зловещих замыслов а от глупых ошибок.
Поэтому, на мой взгляд, не стоит команде без параметров давать больше возможностей деструкции.laurvas Автор
05.10.2018 10:28И всё-таки хочу уточнить:
rm
без-r
удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.9660
05.10.2018 10:59И всё-таки хочу уточнить: rm без -r удаляет только файлы. Даже пустой каталог не захочет удалять, не говоря уже о какой-то вложенности.
О чем и речь. Для того что бы удалить каталог нужно параметр указать явно.
А вы предлагаете такое по умолчанию.
ЗЫ Кроме -r есть еще -d. Но это так, просто к слову.
Sirikid
05.10.2018 11:44+1Так уж вышло, что я часто удаляю симлинки на директории (ещё и от рута), а
rm -r
спокойно удаляет все файлы и только потом пишет что не может удалить сам симлинк. Ситуации бывают разные и я рад, что перестал пользоваться такими алиасами.
Argentalas
03.10.2018 21:54+1Когда в конторе 100500 человек и 100500 машин, которые нынче одноразовые AMI и контейнеры, любые алиасы отпадают, и особенно изменение дефолтного поведения rm
Crystal_HMR
04.10.2018 09:19Если какие-то алиасы и подобное действительно нужны везде — то я бы задумался о пересмотре дефолтной конфигурации контейнера :)
Но ключ -r по дефолту — очень плохая идея, это правда.
Argentalas
04.10.2018 13:39безусловно, в идеальном мире в контейнер/disposable VM никогда логиниться не надо, и скоро (тм) мы к этому придем =)
но пока…
powerman
04.10.2018 13:46Скажем так. Изменять alias-ами команды, которые отвечают за вывод информации (ls, ну grep) — это одно. Изменять команды, которые изменяют/удаляют файлы — это уже совсем другое. Напр.
mkdir -p
это относительно безобидно, максимум возможного ущерба — создаст не те каталоги из-за опечатки в середине пути, что и маловероятно, и вряд ли станет реальной проблемой. Но вот ужеcp -r
это другая тема — я согласен с автором насчёт того, что это легаси и сейчас не актуально, но привыкнув запускатьcp
без-r
рано или поздно можно скопировать намного меньше данных, чем рассчитывал (на машине без этого алиаса), и заметить это через месяц, когда уже поздно будет.legolegs
04.10.2018 14:25mkdir -p
не возвращает ошибки, если директория существует. Это может запутать, если паттерн работы "создать пустую директорию и что-то в ней делать". Если директория не пуста, то в ней можно что-то затереть, или какая-то автоматическая утилита может обработать что-то, что давно там лежит и быть обработано не должно и т.д.
rkh
03.10.2018 10:03Спасибо за статью!
Я пришел в комменты сказать, что сохранять что-либо
wget
-ом прямо в.zshrc
— это, скорее всего, плохая практика (bad practice). Вообще отдельное спасибо за ссылку на арчевый конфиг. Чувствую, что его разбор тянет на отдельную статью, если не на цикл.
miffo
03.10.2018 10:07Без упоминания Antigen и Oh-my-zsh статья не полная.
Так же ленивым любителям готового «изкаробки» — советую заглянуть в CI к камраду Станиславу Попову, который сделал готовый вариант установки ZSH + Antigen + Плагины с помощью Ansible. Удобнейшая штука получилась — указал список хостов в плейбуке и получил рабочее окружение в консоли со всеми своими плагинами и алиасами. Меня часто выручает при деплое виртуалок и новых серверов.
ne_zabudka
03.10.2018 11:47Примерная структура организации, в моем понимании, быстрой системы, которая прошла проверку временем:
Обязательное умение слепого набора на клавиатуре. Тайлинговый оконный менеджер (в моем случае тоже i3). Работа с оконной системой в стиле emacs. Все трех клавишные хоткеи в топку. Клавиши F1-F12 Win и Fn туда же (по моему опыту, пальцам находить их неудобно). Основное правило — «Ctrl — перемещение, Alt — переключение». Например Alt+1 — переключится на первый рабочий стол(in), Ctrl+5 — переместить выделенное окно на 5 рабочий стол(out). Работа с приложениями в стиле vim. Вместо Esc — Ctrl+[. Браузер с вимоподобным плагином (раньше была лиса с vimperator, сейчас хром с cVim), evince, vim, обязательный файловый менеджер ranger дающий поразительную гибкость работы с клавиатуры и позволяющий более комфортно работать чем с некоторыми вим плагинами. В bashrc опция set -o vim. Перекладываем всю рутину на мышечную память пальцев. После этого действительно чувствуешь настоящую свободу работы на компьютере. Со временем мысленная концентрация только над текущей задачей, а пальцы помимо твоего сознания делают свою работу.Sirikid
03.10.2018 12:12Про бинды звучит разумно, но как использовать те же привязки в программах? У меня большая часть команд по управлению wm повешена на super именно поэтому.
ne_zabudka
03.10.2018 14:02Да, встречаются и конфликты, а порой курьезы. Например во время актуальности федора25 повесили на правую Alt модификатор помойму для вывода знака рубля. Я тогда тайлинг накатывала поверх гнома
Cheater
03.10.2018 13:10s/evince/zathura/ :)
ne_zabudka
03.10.2018 14:40Много программ имеют в настройках управление в стиле vim в явной форме или возможность конфигурирования. На мой взгляд засура не только имеет управление в стиле вим но ближе к туи программам с дополнительным набором нативных команд, таких как mocp, newsbeuter, tig но в данном случае я не об этом, а о необходимости держать руки на стартовой позиции клавиатуры и без лишних движений иметь возможность как перемещаться по окнам, рабочим столам так и иметь такой же функционал находясь в окне программы. Выражаясь термином скорости работы алгоритмов, хотелось бы иметь доступ к любому API равный постоянному времени O(1).
yar0Sl0ve
03.10.2018 21:55В bashrc опция set -o vim
$ set -o vim bash: set: vim: недопустимое название параметра
Что вы имеете ввиду?
bykvaadm
03.10.2018 15:18Ctrl+W — стирает не слово, а до разделителя по-умолчанию, который обычно пробел.
$ some words /on/the/screen -> $ some words
Чтобы стереть одно слово используется комбинация Alt+Backspace
$ some words /on/the/screen -> $ some words /on/the/
punkkk
03.10.2018 15:20+1По поводу shell prompt — очень удобно, на мой взлгяд, иметь перенос строки после него, всегда больше места для команды + при копипасте можно не париться о промпте.
balexa
03.10.2018 15:28Если вы работаете с git-репозиториями, то будет нелишним выводить в shell prompt статус репозитория: текущую ветку и состояние рабочей директории. Так вы сэкономите время на командах git status и git branch и не ошибётесь веткой при коммите.
Это весьма спорно. Вы конечно сэкономите время на git status, зато получите постоянные подлагивания на все остальные команды — требуется обойти все директории вверх на предмет наличия .git и прочитать текущий статус, прежде чем вывести prompt. Особенно это неприятно при работе на примонтированных сетевых ресурсах.
powerman
04.10.2018 04:12Есть разные реализации, разные оптимизации. Подлагивают далеко не все. Опять же, от детальности выводимой информации зависит то, удастся ли использовать некоторые оптимизации. При адекватном подходе в случае git всё летает, исключая гигантские репо вроде ядра линуха, но их можно исключать в индивидуальном порядке.
laurvas Автор
05.10.2018 10:47Тоже долгое время сдерживал себя этим аргументом, но в итоге удобство победило. Раньше, оказавшись в локальном git-репозитории, первым делом я вводил команду
git status
, и если он толстый, то всё равно приходилось ждать.
Лаги бывают, но только один раз, когда заходишь в каталог. Если шелл задумался, вычисляяgit status
для промта, а мы спешим, то можно его остановить, нажав Ctrl+C.
Можно убрать статус из shell prompt, оставив только ветку. Так лагов не будет, насколько я помню.
Мне не приходилось работать с git-репозиториями на примонтированных сетевых ресурсах, возможно там действительно всё плохо.
ctacka
03.10.2018 17:12Вот чего мне не хватает, так это видеть в history папку, в которой команда запускалась. Может кто-нибудь что-нибудь подскажет?
susnake
03.10.2018 17:12Если честно, то вывод полного пути в консоли неудобен, ну лично для меня. Т.к. часто оказываешься в каких-то местах и путь занимет всю строку. Например, я сейчас работаю в директории:
/vz/pva/agent/tmp/vzl.40500.4.xxxxxxxx-2f7a-744e-xxxx-xxxxxxxxxxxx.xxxxxxxx-2f7a-xxxx-b359-xxxxxxxxxxxx.oj4cj1apaaaaqay2izvadlyxxxxxxxxx/local-data/
и если бы это херь отображаась бы у меня постоянно в пути — это было бы дико неудобно. Уж лучше несколько раз освежить память и набрать pwdivlad
04.10.2018 06:31в zsh можно ограничивать размер PS1 (см. man zshmisc про %<string<). Например, у меня это сделано так: %25<..<%~.
Вот весь PS1, кстати:
PS1='%(?..[%{^[[31m%}%B%?%{^[[0m%}%b])%(#.%{^[[1;31m%}.%{^[[32m%})%n%{^[[0m%}@%m %B%25<..<%~%b %h%# '
edo1h
03.10.2018 19:16Не забывайте, что алиасы не работают в скриптах! Там надо указывать все ключи.
Для меня это достаточная причина не использовать подобные алиасы.
Не затронута и ещё одна проблема агрессивного тюнинга под себя: дискомфорт при необходимости работать в «чужой» системе, а эта проблема есть.powerman
04.10.2018 04:26Есть. Я тоже опасался при переходе на zsh, что это будет критично. На самом деле, неудобства, те или иные, есть всегда.
Раньше их было больше на рабочем компе, сейчас на рабочем компе почти всё (времени нормально разобраться в настройке автокомплита zsh у меня не хватило, так что он иногда работает странно — будет время, допилю) стало намного лучше. Раньше на удалённых компах их было меньше, сейчас их немного больше.
По факту — от перехода на zsh я не забыл bash и как работать в нём на удалённых компах. Отличия есть, но не настолько критичные. Так что новые неудобства совершенно однозначно не перевешивают новые удобства — по факту в результате (если брать в среднем по всем местам где набираются команды) стало таки заметно лучше. Кое-где на удалённых машинах я добавил алиасов в bash. Кое-где поставил zsh, но это скорее в качестве эксперимента, пытался понять насколько он мне там реально нужен — по факту оказалось, что не особо.
Paran01d
03.10.2018 21:57+1Поделюсь своим опытом овладения методом слепой печати. Как и автору статьи «Сало на клавиатуре» не дало практически никакого результата. Наилучший результат дало набирание реальных текстов (в моем случае крылатых выражений и цитат) в Stamina. Возможно несколько десятков часов проведенных перед этим в Солло, тоже повлияли на результат. В общем я поступил радикально, просто заклеил все буквы на клавиатуре наклейками, что бы отучиться от рефлекторного подсматривания. Так же сделал распечатку раскладки и установил ее между монитором и клавиатурой. Она нужна что бы подглядывать за забытым расположением клавиш, особенно не алфавитных (собаки, шарпы, тильды и т.д.), так как они запоминаются гораздо дольше. Проделал я это (каюсь) и на работе и дома. Момент был выбран не нагруженный, что бы не сильно вредить рабочему процессу. Первая неделя это был ад. Т. к. работать было практически невозможно. Во обще то я и занимался в основном не работой, а клавиатурным тренажером, с перерывами на почитать что нибудь профильное. Ко второй неделе я уже вполне сносно (практически не доставляло дискомфорта) освоил ЙЦУКЕН раскладку (150-200 с/м, в зависимости от сложности текста), к концу месяца и QWERTY.
Текущий итог:
-На некоторые символы (;%:?*) мышечная память не появилась до сих пор (за 10 лет), видимо довольно редко ими пользуюсь.
— Текущая скорость около 250с/м, больше не растет, видимо это особенность моего мозга, я и читаю довольно таки медленно, порядка 100-120 слов/мин., проговариваю все прочитанное и написанное про себя.
— Понял, что пишу, как и читаю, по слогам, точнее наверное не слогам, а небольшими блоками, характерными для языка. Если текст состоит не из таких блоков, скорость падает катастрофически, в несколько раз.
— Не разу не пожалел о потраченном времени, как минимум глаза устают гораздо меньше, не нужно постоянно переводить фокус с экрана на клавиатуру и обратно.
А потом я узнал про VIM, но это уже другая история.))Crystal_HMR
04.10.2018 09:09Посчастливилось мне в 7-8 классе попасть в местный Лицей Инф.Технологий на дополнительные. Одно из занятий была "Информатика", которая была похожа на любую школьную программу по этому предмету (уныло и не информативно), за исключением одного: один из их выпускников написал на делфи клавиатурный тренажер, используя все те же методики, что и в большинстве популярных программ (начинаем с "ао", потом растем до горизонтального ряда "фывапролджэ", и т.д.), но в более красивой оберточке, с экранной клавиатурой с подсветкой положений каждого пальца, текущего символа и следующего за ним.
А еще они наколотили П-образных закрывалок, которые ставились над руками. И каждое занятие заставляли минут 10-15 (из полутора часов) провести за тренажером.
С латиницей у меня проблем не было (с детства был subor, только китайский. На клавиатуре был англ и иероглифы. На одном из стоковых картриджей было два клавотренажера), а вот с кирилицей я тогда намучался знатно. Но, вероятно, скорость набора моя тогда выросла знаков до 120, что являлось советской нормой для машинистки, и я успешно сдал "зачет" по этому делу.
Спустя лет пять мне пришлось переучиваться, потому что коллега кинул линк на тогда только появившиеся "клавогонки", адово перегнал в заезде, сайт показал мне чуть меньше 100 символов, и кучу советов. Я начал следовать советам и уже через пару месяцев печатал 230 символов в минуту. Забил, через пару лет пришел, еще за пару месяцев сделал почти 300. И так, забивая на год-два, потом возвращаясь я догнал до 400-500 символов в минуту (это при переписываемом тексте). Замерял TypeStatistic'сом в момент жаркого форумного спора (это когда мысли формируются очень быстро, только записывать успевай) — получилось почти 800 сим/мин при 1.5% ошибок. Сейчас работаю над безошибочным вводом :)
Ну и да, я ни разу не пожалел о потраченном времени. И с Vim'ом тоже :) Вчера очень удивился, но один из коллег сказал "ты вимом пользуешься? Запомнил все хоткеи что-ли?" (вроде бы все давно знают, что я упорот), на что я сказал, что за весь его просмотр я воспользовался от силы десятком, но это было настолько быстро, что он восхитился и ушел читать мануал (это не поможет, ему станет лениво, но это уже не мои проблемы)
FTOH
03.10.2018 21:57Спасибо! Всегда нравился терманал в установщике Arch Linux, но как то не приходило в голову загуглить конфиг.
Не знаете, почему иногда при открытии терминала появляется знак прочента на пустой строке?
ZyXI
04.10.2018 03:54Если команда не вывела в конце новую строку, то эта возможность zsh предотвратит слияние вывода команды с приглашением ко вводу.
Это лучше объяснить на примере: запустите
zsh -f
и наберите тамecho -n abc
. Получите что?то вроде
# zsh -f zyx-desktop% echo -n abc abc% zyx-desktop%
(процент после abc нарисован инвертированно) (кстати, хочу заметить, что при копировании между подсвеченным
%
иz
нет символа новой строки, только много пробелов).
Если попробовать эквивалентный вариант с
bash
, то получите что?то вроде
# bash --norc --noprofile bash-4.4$ echo -n abc abcbash-4.4$
С неподсвеченными приглашениями ко вводу это особенно заметно: попробуйте быстро найти где заканчивается
abc
и начинается приглашение. И это не всё: нажмитеt
и дождитесь, пока символов не станет много (для гарантии — пока «команда» не перейдёт на новую строку). Когда у вас набралась команда видаtttttttttttttttttttttttttttttttttttttttttttttttttttt
нажмите<C-u>
. В нормальной ситуации вы получитеbash-4.4$
. Сabcbash-4.4$
вы получитеabcbash-4.
: bash не понимает, где реально находится ваш ввод и все возможности, которые должны знать позицию курсора, будут работать некорректно.
Vitos85
03.10.2018 21:57+1Что мы делаем, когда хотим стереть что-то длинное? Зажимаем Backspace и смотрим как курсор бежит назад, забирая лишние буквы.
— лично я зажимаю Ctrl+Shift+Left если хочу удалить несколько предыдущих слов или Shift+Home если хочу удалить полностью строку, а потом уже Backspace. Удалять посимвольно Backspace-ом давно перестал.laurvas Автор
05.10.2018 10:13На примере Backspace я объяснял задержку и частоту автоповтора. Эти два значения влияют на всю клавиатуру, а не только на Backspace. Неужели вы никогда не используете автоповтор? Может быть хотя бы стрелочки ^v для скролла?
legolegs
03.10.2018 23:56Если кто-то проникся статьёй, но с баша на zsh перелезать не готов, то предлагаю свой PROMPT c путём и кодом возврата, но на двух строках, чтобы длинные пути не мешали набирать команды. Выглядит так (только малость по-попугайски расцвечен):
-[legolegs@host ~/path] :)
L>
код для ~/.bashrcexport PS1='\[\e[36;1m\]-\[\e[0m\]\[\e[36m\]\[\e[30;1m\][\[\e[0m\]\u\[\e[47;1m\]@\[\e[0m\]\h \[\e[35;1m\]\w\[\e[0m\]\[\e[30;1m\]] $(erco=$?;[ $erco == 0 ] && echo -n "\[\e[32;1m\]:)\[\e[0m\]" || echo -n "\[\e[31;1m\]:(\[\e[0m\] \$?=$erco" )\[\e[0m\]\n\[\e[36;1m\]L\[\e[0m\]\[\e[36m\]\[\e[0m\]\[\e[34;1m\]>\[\e[0m\] '
ivlad
04.10.2018 05:58Пусть лучше shell prompt сообщит, если команда завершилась неуспешно.
У меня это место оформлено несколько иначе: если код возврата ненулевой, zsh выведет его в приглашение, иначе ничего выводить не будет. Достигается вот так: %(?..[%{^[[31m%}%B%?%{^[[0m%}%b]), выглядит сложно, но если убрать Esc-последовательности, станет понятнее: %(?..[%?]).
inkvizitor68sl
> Хм, куда бы припрятать текущий ввод? Вот сюда и припрятать.
alt+shift+3
laurvas Автор
Поясните пожалуйста в чём прикол.
inkvizitor68sl
Это «краткий алиас» для последовательности из ctrl-a, #, ctrl-e, ctrl-o. Сохраняет закомментированную строку в history.
laurvas Автор
Хм, не знал о таком. Ваш способ требует больше телодвижений для запуска: надо поднять команду из истории, перейти в начало строки, убрать начальный #. Но зато припрятанное точно не потеряется.
inkvizitor68sl
Ну в вашем способе буфер потрется при использовании ctrl-w, а это очень вероятно =)
А вообще можно ещё использовать ctrl+/ (undo в emacs-mode readline).
ynikitenko
Поднять команду из истории легко Ctrl-p. Запустить её можно Ctrl-m.
powerman
Вообще-то в zsh есть штатный механизм для этой фичи:
push-input
. Судя по быстрому взгляду на используемый автором конфиг у него он может срабатывать поCtrl-z
. Я себе настроил наCtrl-q
иEsc-q
вот так:Работает следующим образом:
laurvas Автор
Вот это вы раскопали! Круто!
nlykl
Эта фича должна быть во всех современных мессенджерах :)
Pinkerton42
Я проще делаю: в конце введенной команды ставим обратный слеш, Enter, Ctrl+C. После этого все осядет в истории.