Pull to refresh

Comments 108

Можно в .inputrc добавить
"\e[A": history-search-backward     
"\e[B": history-search-forward  

И можно будет искать по истории, просто введя часть команды и нажав стрелку вверх. (вниз тоже работает для поиска по истории)
И в /etc/inputrc для system-wide. Очень удобно дистрибьютить менеджерами конфигураций.
Я перенял это для себя из zsh на FreeBSD

Не все, кстати, знают, что начав что-то набирать ("префикс" типа sudo ) повторным нажатием можно "путешествовать" по истории вверх

С тех пор как узнал, все время пользуюсь сочетанием 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.
Спасибо, теперь я его тоже открыл )
Только не
cat /etc/passwd | column -t

а
column -t /etc/passwd

Любая приличная консольная утилита, которая может принимать данные из stdin, может также читать их из файла, указанного аргументом командной строки. А с неприличными можно воспользоваться перенаправлением потоков ввода/вывода:
column -t < /etc/passwd

Stop piping cats! Не труби кота! Запуск процесса — относительно дорогая операция. Так что не надо дёргать утилиту cat когда это не надо.
Мне чаще удобне сделать поставив cat первой коммандой.

Например:
1) смотрю файл — cat /etc/passwd
2) Ох, длинный какой — cat /etc/passwd | head
3) все равно нужных записей нет — cat /etc/passwd | grep 'XYZ'
4) ага, а теперь выделим только нужное — cat /etc/passwd | awk…

те чтобы заменить комманду достаточно нажать стрелку вверх и ctrl+w
Ну во-первых совет избавляться от cat актуален для кода, который будет исполняться многократно (скрипты, циклы), либо его будут читать другие люди (скрипты), т.к. более короткую запись проще воспринимать. А при повседневной работе делайте как удобно.

Но с другой стороны в описанном вами сценарии от использования cat удобнее не становится! Натравливать cat на файл неизвестного размера чревато, лучше сразу начинать с head $FILE. А чтобы потом отфильтровать по шаблону:
grep pattern Alt-.
Альт-точка подставит последний аргумент предыдущей команды (head)
Потом так же можно будет подставить в awk путь к файлу одним хоткеем.

Или ещё по-другому: начинать с less $FILE. Много лишнего и нужно отфильтровать? при запушенном less набрать
&PATTERN<enter>
И less спрячет строки не соответствующие шаблону. Сделать выборку? Опять же из запущенного less
!awk '{print $1+$2}' %<enter>

less подставляет путь к отображаемому файлу вместо %
column -t < /etc/passwd
А если здесь перепутать направление угловой скобки?

… то ничего не случится, потому что нечего работать от пользователя root.


Или придётся восстанавливать из бэкапа, который ведь у вас есть, правда? Ну в крайнем случае из /etc/passwd-


А кроме того это ещё нужно поискать утилиту, для которой понадобилось бы использовать перенаправление ввода. Все GNU утилиты умеют читать ввода из файла.

ого, теперь я знаю как можно легко сортировать пузырьком прямо в терминале)
Была же аналогичная статья на хабре году в 11. За «буква в букву» не ручаюсь, но точно эти команды там всплывали.
Что может появиться нового в Linux за какие-то 6 лет?)
> cat /dev/urandom > /dev/null

Это загрузит только одно ядро.

Можно добавить " | pigz" между ними, тогда будет много ядер :).

Не поможет. /dev/urandom выдаёт данные медленнее, чем gzip (однопоточный!) их архивирует. Зато можно запустить cat /dev/urandom несколько раз по количеству ядер.

Да, на моей тачке всего 11 мб/сек выдает чтение из /dev/urandom, в принципе gzip может быть и будет успевать. Ну можно добавить флаг "-9", тогда ему потяжелее будет :).

Вот так интереснее, видно с какой скоростью рандомный поток летит вникуда:
pv</dev/urandom>/dev/null

Ожидал увидеть терабитную скорость из /dev/zero, а увидел только 16,1GiB/s. Что её ограничивает?
pv</dev/zero>/dev/null
Похоже на скорость оперативной памяти. DDR3 2133Mhz?

А откуда ожидания терабита?

в п.3 вывод примера и его описание не соответствуют самому примеру.
Для соответствия пример должен быть таким:
while ! cat ./run.sh; do sleep 1; done

Пункт 3 "Напиши скрипт одной строкой"

Иногда использую для перехода в домашний каталог cd без параметров.

Одна из самых полезных функций для меня — можно ввести первые буквы и нажать TAB. Автоматически добавляет окончание либо предлагает варианты.

Для вариантов нужно второй раз таб нажимать. По крайней мере в баше по умолчанию.

а еще есть bash smart completion которая не только автокомплит команд делает, а еще и аргументов.
Ещё такое есть:
bind 'set show-all-if-ambiguous on'
bind '"\C-n":menu-complete'
bind '"\C-p":menu-complete-backward'
Ну без tab терминалом вообще невозможно пользоваться, а статья называется "… о которых никто не знает"
UFO just landed and posted this here
Ну, от эмулятора терминала, наверное, мало что зависит (разве что он будет глотать сочетания клавиш). От дистрибутива тоже вряд ли, если только он не поставит себе целью поломать те же сочетания.
А вот то, что кроме bash есть другие оболочки, возможно, таки является для них сюрпризом.
UFO just landed and posted this here
Да, про утилиты согласен.
№9
Плохо подходит для многоядерных систем, если не запускать по количеству ядер.
Что-то близкое к требуемому одной командой можно получить, скажем, так:
cat /dev/urandom | pbzip2 -c > /dev/null 

Таким образом получается утилизировать весь либо почти весь процессор
gnu/parallel?
parallel 'cat /dev/urandom > /dev/null #{}' ::: x x x x
ну или так:
parallel 'cat /dev/urandom > /dev/null #{}' ::: {1..4}

parallel 'cat /dev/urandom > /dev/null #{}' ::: `seq $(nproc --all)`
Много мелких приёмов, всех не вспомнить. Например:
— Автодополнение можно настроить для чего угодно (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 прокси;

… и т.д., имя им легион
Про pv есть в статье, правда там не объяснили, что работает только в тех командах, где есть вызов pipe
А как же навигация по командной строке:
Ctrl+b/Ctrl+f для перемещения на одну букву
Ctrl+a/Ctrl+e для перемещения в начало/конец строки
Ctrl+w — удаление одного слова
Ctrl+u — удаление всех символов слева от курсора
Ctrl+k — удаление символов справа от курсора
В строгом смысле поддерживается большинство emacs'совских комбинаций клавиш (без префикса)

добавляем сюда jobs <%n> и kill %n (где n — номер задачи).

Люблю такие статьи тем, что в комментариях будет намного больше полезного, чем в самой статье.

UFO just landed and posted this here
Комбинация клавиш Ctrl + U убирает из строки всё то, что уже в неё введено.

Ага, а Ctrl + Y снова вставляет строку, аналог Ctrl + X / Ctrl +V в винде. Удобно если вспомнил что перед одной командой надо ввести другую, а заново набирать лень и к мышке тянутся тоже :)

Можно мои 5 копеек?


  1. В команде "more file.txt" можно перемещаться вперед и НАЗАД кнопками f (forward) и b (backward). Ровно так же это делается и в man. Кнопка "v" приводит к тому, что файл передается редактору vi на редактирование. Если в режиме vi дать "<ESC> set nu", то уже vi пронумерует строки. Выход из vi — "<ESC> q".
  2. Кнопка / позволяет иcкать в more и в vi
  3. Команда "gunzip -c file.tar.gz | tar xvf -"  позволяет распаковать одной строкой tar.gz  архив (есть и другой метод, но мне этот более понятен). По сути gunzip -c вываливает результат в stdout, а символ "-" после пайпа вбирает в себя вывод из stdout в свой stdin.
  4. Что такое "su user" (если без user, то в root-а) знают все, но уверен, что не все знают, что "su — user" переводит в user-а со всеми переменными окружения этого пользователя.
  5. Все знают, что "cd" без параметров приводит к тому, что директория меняется на "home" (cd $home). А если сделать "cd ~/dir1", то получается "cd $home/dir1".
  6. Команда "ls -1 | wc -l" выдаст количество файлов и папок в директории. Если дать "ls -1d | wc -l", то количество папок. Если дать "ls -1f | wc -l", то количество только файлов.
  7. Команда "ll" — это аналог "ls -l" (во многих unix-ах). Если это не так, то всегда можно сделать alias.
  8. Комбинация "<CTRL> u" — убирает все символы левее курсора
  9. Комбинация "<CTRL> a" переводят курсор в начало строки
  10. Комбинация "<CTRL> e" переводят курсор в конец строки

Пункты 8-10 работают и в vi.

3. Достаточно же tar xf filename.tar.gz
  1. это только с GNU-сным таром;
  2. tar xzf filename.tar.gz
    без "z" tar выдаст ошибку.
  3. tar xjf filename.tar.bz2
Я попробовал tar xf без дополнительных букв в Ubuntu 16.04 и CentOS 7.3 — работает без ошибок. Возможно какие-то старые и экзотические оси требуют отдельного указания формата архива и не могут его определить самостоятельно, но я с такими видимо не работаю.

Да, вы правы насчёт центоси — работает без указания формата.

Забыл сказать, что для п.3 исходный tar.gz не меняется (не распаковывается просто в tar).
  1. Это не аналог, это именно предопределённый алиас в некоторых дистрибутивах/системах. Проверяется элементарно — вызовом команды alias
Да, может быть. Если первый вызов ll не давал результата, а нужно что-то делать с расчетным временем более 5-10 минут, то вкручивал alias.

Если забыли при вводе команды добавить pv, то для большинства базовых команд (cp, mv, dd, tar, gzip и пр.) поможет progress
https://github.com/Xfennec/progress

Может какой-нибудь ztar?
Я для себя выбрал вариант, который всегда везде (емли есть gunzip, конечно).
Мне вот упорно кажется, что хостингу VPS/VDS есть о чем рассказать, помимо «лайфхак-гайдов», 100% которых гуглится в интернете, и достойных школьника, случайно прорвавшегося на хабр.
UFO just landed and posted this here
cat /dev/urandom > /dev/null у меня загружает процессор примерно на 30%, для полной нагрузки есть stress -с numcores

У меня занимает 100% одного ядра, причём в режиме ядра. stress жрёт юзерспейс.

Для целей «теста батарейки» или стабильности системы — никакой разницы между kenel и user загрузкой нет. А вот загрузить все ядра — важно.
Надеемся, некоторых из тех десяти приёмов работы в командной строке Linux, которыми мы хотим с вами поделиться, попадут в ваш личный список полезных команд.
№9. Стресс-тест батареи ноутбука
$ cat /dev/urandom > /dev/null
Ну как так-то…
Уже шутили про очень полезную команду rm -rf /? Пробовать обязательно всем. Лучше на проде
Кстати, есть такая реальная проблема — многие программы создают временные файлы с именем "~", которые со временем начинают забивать диск. Поэтому иногда рекомендуется выполнять команду «rm -rf ~», чтобы удалить такие файлы во всех подкаталогах.
мне очень нравится команда locate -A word1 word2

Есть два небольших нюанса:


  • пакет, содержащий locate, надо ставить ручками;
  • базу данных locate также надо регулярно обновлять.
разве это проблема?
yum -y install mlocate
updatedb
в убунте она из коробки
Иногда нужно запустить команду с определенными переменными окружения, можно сделать это одной строкой:
$ JAVA_HOME=/java/home ./run.sh
От себя добавлю:
1.
$ pushd <some_dir> #добавляет директорию в стэк
$ popd #переносит вас в ту директорию удаляя ее из стэка


2.
$ history
999 pwd
1000 exit
1001 history
$ !999 #Выполняет команду из истории
/home/daniyar94
pushd и popd вообще выручают, когда надо копаться в конфигах разных программ

Для 8 пункта в свое время придумали tar

UFO just landed and posted this here
Тоже не понял смысла. Но видимо автор имел ввиду команду
cat /etc/passwd | column -t -s :

Alt + Backspace — удаление слова в консоли.
мой путь начинающего линуксоида стал значительно менее тернист после того, как я узнал об apropos :)
Стопицот раз уже про одно и то же. ИМХО, кому работать реально в терминале нужно будет — найдёт намного более продвинутую и полную статью (их на хабре достаточно) или даже 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"

Нормальных обзорных статей по такого рода возможностям особо-то нет, а хотелось бы.

Помнится, мы ещё под DOS-ом писали резидентные менюшки, которые по F2 всплывали везде, где надо, и содержали в себе нужные шорткаты, чтобы их не запоминать, и не выстрелить себе в ногу случайно (особенно на вторые сутки без сна в 5 утра)). F2 — потому что в VC тоже было неплохое пользовательское меню по этой кнопке.


То есть 20 лет назад под DOS это было, а сейчас под *nix надо держать в голове параметры какого-то pbzip2, а чтобы показать список последних команд надо что-то шаманить… Что стоило за это время улучшить bash или просто сделать что-то получше? У того же абсолютно инопланетного vi все же появились человеческие альтернативы типа nano…

Это классический метод взаимодействия с компьютером и он никуда не делся. Он показал свою эффективность и работает очень уверенно ( cli в cisco, shell в linux ). Такое взаимодействие позволяет быстро комбинировать простые программы и получать результат. Графический интерфейс до сих пор не дорос до подобного.
Держать в голове параметры не надо у всех утилит есть справка
pbzip2 --help
man pbzip2
info pbzip2

bash-completion

«vi имеет два режима в одном он пищит в другом всё портит»
на основе vi сделан vim — один из самых эффективных редакторов
Между текстовым режимом и графическом есть ещё много градаций. Эффективность у чисто текстового ввода по сравнению с текстом+менюшки для шорткатов сильно ниже, вероятность ошибок у чисто текста — сильно больше. Мне кажется, это очевидно.

htop удобнее чем просто top, а top удобное, чем вывод по строкам (как в ping, например). Текстовые интерфейсы давно эволюционировали, но наследие сильнО ))
вероятность ошибок у чисто текста — сильно больше. Мне кажется, это очевидно.

А мне кажется, что ровновно наоборот. Вернее так, вероятность деструктивных ошибок, в GUI намного выше, если GUI и CLI обеспечивают одинаковую функциональность.

UFO just landed and posted this here

Большое спасибо) тоже мучался, даже не задумываясь о поиске альтернативы)

Есть же прекрасный и удобный cmder.net. После него смотреть на стандартную консоль windows без слез нельзя :)
первая команда, которую я набираю в консоли windows — bash $)
UFO just landed and posted this here
Установка параметров для службы spooler (диспетчер печати), в частности права ставит как надо тому, кто забил такую команду. По сути — жесть конечно.
UFO just landed and posted this here

Это работает по дефолту? У меня вместо влево вставляется 5D, а вместо вправо 5C.

Добавлю свои 5 копеек.
Изначальный хоткей в баше: alt+b и alt+f

Да, по умолчанию ALT+b/f. Натолкнуло на мысль, кстати, поменять эти шорт-каты. Пользуюсь постоянно, но всегда неудобно.
Нашёл здесь вариант как сменить на CTRL+arrow keys. https://superuser.com/a/488158/683161

все перемещения по тексту и работа с историей — это функциональность библиотеки GNU readline
и работают не только в Bash, но и, естественно, во всех «консолях», которые её используют (irb, например)
красивые таблички/cheat sheets — в гугле по запросу, хотя то же самое описано по приведённой выше ссылке
№9. Стресс-тест батареи ноутбука

Про многоядерные CPU уже написали, но у ноутбука есть ещё GPU и радиомодули. Как нагрузить их из терминала для стресс-теста батареи?
GPU — каким-нибудь криптомайнером или кодированием толстого видеофайла.
Радио — торрентом.
№1 в сложных жизненных ситуациях может дополнить пара pushd / popd

№2 изящно расширяет утилита thefuck.

№7 я бы дополнил ^X^E — открывает текстовый редактор ($EDITOR) с содержимым командной строки; при выходе с сохранением показывает его в командной строке. В bash работает сразу, в zsh надо в .zshrc написать

autoload -z edit-command-line
zle -N edit-command-line
bindkey "^X^E" edit-command-line
bindkey -M vicmd v edit-command-line
Sign up to leave a comment.