Пользователь
0,0
рейтинг
22 октября 2013 в 01:30

Администрирование → Десятка лучших консольных команд

imageВ данном посте я расскажу о наиболее интересных командах, которые могут быть очень полезны при работе в консоли. Однозначных критериев определения какая команда лучше другой — нет, каждый сам для своих условий выбирает лучшее. Я решил построить список команд на основе наиболее рейтинговых приемов работы с консолью от commandlinefu.com, кладовой консольных команд. Результат выполнения одной из таких команд под Linux приведен на картинке. Если заинтересовало, прошу под кат.

Десятое место

Ввод последнего аргумента недавних команд. Удерживая ALT или ESC, с каждым нажатием на точку в строку ввода будут подставляться параметры предыдущих команд, начиная от недавно введенных к старым.
Комбинация 'ALT+.' или '<ESC> .'

Девятое место

Переинициализация терминала без завершения текущей сессии. Например, в случае когда в терминал были выведены двоичные данные и он перестал корректно работать.
reset

Восьмое место

Создает пустой файл. Уничтожает содержимое файла без его удаления.
> file.txt

Седьмое место

Запуск команды с пробелом перед ней не сохраняет ее в истории. Может пригодиться при передаче паролей программам в открытом виде.
<пробел>команда

Шестое место

Запуск редактора для ввода сложной команды или скрипта, выбор редактора определяется переменной $EDITOR
Комбинация 'CTRL+X E'

Пятое место

Утилита My Traceroute эффективнее, чем комбинация traceroute и ping. Утилита mtr сочетает в себе функциональность traceroute и ping, позволяет проводить диагностику сети в более наглядном виде.
mtr google.com

Четвертое место

Запуск предыдущей команды с заменой в ней подстроки, например, с foo на bar. Полезна при опечатках. Если ввести просто ^foo, то в предыдущей команде первое вхождение foo будет удалено.
^foo^bar

Третье место

Возврат в предыдущую рабочую директорию. Может пригодиться и для переключения туда-сюда между двумя директориями.
cd -

Второе место

Запуск HTTP-сервера в текущей директории на 8000 порту. Если в директории нет файла index.html, то будет показан её листинг.
python -m SimpleHTTPServer

Первое место


Запуск последней команды под root.
Полезна когда забыли использовать sudo для команды. "!!" — подставляет последнюю введенную команду.
sudo !!


Надеюсь, что каждый найдет в этом рейтинге нечто новое и интересное для себя.
@Spetros
карма
49,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (215)

  • –66
    rm -rf
    • +125
      sudo !!
    • +6
      sudo !! *
      

      если уж на то пошло
      • 0
        удалит только то что находится в текущей директории, может наоборот только поможет, например почистит папку загрузок
    • +5
      Смотрю и вижу почти статью

      www.commandlinefu.com/commands/browse/sort-by-votes
  • +45
    ух ты, про "<пробел>команда" не знал, до сих пор огород горожу с автоочисткой истории для вычищения паролей. Век живи — век учись.
    • +10
      $ kill -9 $$
      • +8
        Роспотребнадзор не одобряет.
      • +3
        А два $ в конце что делают?
        • +47
          Взятку дают
        • +5
          $$ — PID (Process ID) текущей сессии bash.
      • +4
        Я всегда делал
        kill -9 0
        Экономия в одном нажатии :)
    • +10
      Это работает далеко не всегда. Просто иногда в rc файле объявлена export HISTIGNORE="[ ]*" ( ну или нечто подобное ). Когда этого нет, все команды с пробелами впереди точно так же сохраняются.
    • +3
      А зачем Вам вообще эта история? Я много лет назад прописал общесистемно (в /etc/env.d/99local):
      HISTFILE="/dev/null"
      
      и с тех пор было может пяток случаев, когда я пару секунд жалел, что нет истории команд. Фокус в том, что во-первых история по-прежнему доступна пока не закроется терминал, а во-вторых стандартный подход с сохранением истории в файле не очень-то хорошо работает, когда одновременно открыто несколько терминалов (а у меня штатно открыто всегда 15). Делал я это из соображений безопасности, но был поражён, насколько слабо это отразилось на юзабилити.
      • +25
        Привожу часть моего .bashrc.
        Последние строчки позволяют сохранять историю хоть в 100, одновременно открытых терминалах.

        #Чтобы одинаковые команды не сохранялись в истории, добавьте строчку:
        HISTCONTROL=ignoredups
        #Не добавлять запись в историю команд, если команда начинается с пробела:
        HISTCONTROL=ignorespace
        #стираются все повторения, в том числе идущие не подряд, но в разной последовательности. (например, после cd..ls..cd..ls останется cd и ls)
        HISTCONTROL=erasedups
        # Чтобы история команд сохранялась сразу после ввода (а не во время закрытия терминала)
        shopt -s histappend
        PROMPT_COMMAND='history -a'

        • +1
          добавлю сюда еще HISTSIZE=n
          где n — сколько строчек хранить в хистори.
        • 0
          Добавил в .bashrc. Как-то не так работает как я ожидал, если честно. Например набрал несколько команд в одном терминале. Без его закрытия открыл второй, все команды, набранные в первом видно в истории второго. Теперь набираю команды во втором. И вот уже этих команд в истории первого терминала не видно. Что я делаю не так? Или это фича?
          • 0
            Я как понял, файл истории подгружается только при открытии консоли. Нельзя ли зделать это например еще и при помещении фокуса на консоль к примеру. Или хотя бы на какой-нибудь хоткей повесить?
            • +15
              Нашел.
              PROMPT_COMMAND='history -a; history -n'
              Нажатие Enter в консоли обновляет историю. По сути история будет обновляться после выполнения каждой команды. Возможно это не очень удобно.
              PS Тихо сам с собой веду беседу, спасибо за внимание…
              • 0
                Спасибо за history -n'.
                Не дописал.
        • 0
          Хм, откуда в history вот это:
          17705 PROMPT_COMMAND='pwd>&8;kill -STOP $$'
          • +1
            Могу предположить, что это MC плюет командами в историю терминала. Проверьте. Если так, то это легко лечится.
            • 0
              Действительно, запускал mc. А как лечить?
              • +2
                Чтобы при установленном PROMPT_COMMAND=’history -a’ не записывалась в историю, все то, что подаёт на вход bash Midnight Commander, нужно добавить в HISTIGNORE:

                export HISTIGNORE=”&:ls:[bf]g:exit: cd \”\`*: PROMPT_COMMAND=’*”
                
                

                Пробелы перед cd и PROMPT обязательны

                Это mc при бегании по каталогам башу на вход подаёт команды “cd туда-же”, то есть запараллеливает текущий каталог на панели и текущий каталог в шелле.
          • 0
            Del Судя по всему, с помощью этой команды mc узнаёт, какой текущий каталог, чтобы показывать приглашение. Так что лучше не убирать
          • 0
            В своем коментарии дал очень важное замечание: опции HISTCONTROL нужно писать через двоеточие в одной строке, иначе следующие опции затирают предыдущие.
        • +1
          HISTCONTROL содержит опции, разделённые двоеточием. Например:

          HISTCONTROL=ignoredups:ignorespace

          В вашем каждый следующий HISTCONTROL=… перетирает предыдущий
          • 0
            А ещё есть HISTCONTROL=ignoreboth
        • +1
          И вообще, нужно писать HISTCONTROL="$HISTCONTROL: что-хотите-добавить"
          А то HISTCONTROL по дефолту содержит, например, ignorespace, который позволяет писать пробел в начале команды, чтобы она не попадала в history. Судя по всему, ребята из этой ветки все перетёрли свой HISTCONTROL, трюк с пробелом перестал работать, в результате mc начал плеваться командами в history. Все команды mc начинаются с пробела, поэтому трюк с HISTIGNORE не нужен, достаточно лишь убедиться, что HISTCONTROL не перетирается.
          • 0
            Благодарю Вас за столь ценное замечание. Всегда казалось костылем решение проблемы с плеванием mc в history.
            Курите маны, как говорится.
            В свое оправдание могу сказать, что тема была о сохранении истории команд при работе одновременно в нескольких терминалах.( а также тем, что уже более 2-х лет на ).
            Но вписав свои HISTCONTROL в конфиг, я ввел других в заблуждение. За это прощенья мне нет. Сейчас дам ссылку на Ваш комент всем основным участникам.
      • 0
        а у меня штатно открыто всегда 15

        Если не секрет, зачем столько?
        • 0
          У меня обычно бывает в районе 4-х. В одном запущен сервер в sbt, в другом пушу пуллю гит, в третьем монга-консоль, в четвертом логи сервера, в пятом запущен другой sbt в котором гоняю утилиты, шестой для других надобностей, не связанных с текущей разработкой.
          • +21
            Итого четыре
        • +3
          У меня просто система настроена на «полноэкранный режим» — всегда открыто 24 виртуальных десктопа, между которыми я переключаюсь по Alt-Fx и Alt-Shift-Fx. В каждом запущено одно приложение (обычно распахнутое на полный экран и без оформления окна — рамки и заголовка с кнопками закрыть/минимизировать). В 23-х десктопах приложения запускаются автоматически, при старте X-ов, один десктоп оставлен свободным на случай если понадобиться запускать какие-то редко используемые приложения.

          Так вот, из этих 23-х у меня в нескольких запущены приложения — браузер, IM, почта, mc, mysql клиент, торрент, просмотр логов — а в остальных свободные терминалы, отсюда и такая цифра. Из этих 15 штук 5 используется для запуска ssh на сервера, пара для работы под рутом, etc, — в общем, по факту просто пустых терминалов для текущей работы остаётся всего штук 6.

          В общем и целом это невероятно удобно. Сразу после загрузки машины я знаю, что по Alt-Shift-F1 у меня ssh на главный сервер, по Alt-Shift-F12 рутовая консоль, по Alt-F1 mc, по Alt-F2 клиент mysql, по Alt-F11 браузер, etc.
      • 0
        а во-вторых стандартный подход с сохранением истории в файле не очень-то хорошо работает, когда одновременно открыто несколько терминалов

        В интернете опять кто-то не знает про zsh.
        • 0
          Я то сам давно на zsh сижу, но те, кто еще не пересел, тоже удобств хотят. Вот и не выбрасываю свой bashrc , глядишь кому пригодится.
        • –4
          zsh тормозит. тчк
          • НЛО прилетело и опубликовало эту надпись здесь
          • +1
            oh-my-zsh подобные штуки с горой скриптов по апдейту гита/руби/приготовлению кофе/гипернавороченным промтом тормозят, да. голый — не тормозит.
            • 0
              А вы лишний раз не нажимайте [tab], в bash же вы при git… таб не жмете?
    • +1
      наврал он, в CentOS сохранило
    • +3
      Наш админ не растерялся www.commandlinefu.com/commands/browse/sort-by-votes Учитесь, есть где
      • 0
        Интересно, почему автор не сослался на очевидный источник.
        • 0
          Я решил построить список команд на основе наиболее рейтинговых приемов работы с консолью от commandlinefu.com, кладовой консольных команд


          Сослался, просто не сделал линком.
          • 0
            Простите, не заметил.
    • 0
      А я знал, почти всегда использую пробел, чтобы не загромождать history дублирующими командами или которые больше не понадобятся.
      Если нужно найти нужную команду которую делал, но не могу вспомнить точно всю команду, делаю history | grep *** например.

      Если, кто-то стоит сзади, когда что-то правим, вечно скажет — нажми стрелку вверх для предыдущей команды, а у меня там ничего нету.
      • 0
        В zsh если привязать вверх к history-beginning-search-backward (или просто оставить функцию по‐умолчанию), то независимо от того, была ли помещена предыдущая команда в историю или нет, стрелка вверх её покажет. Но если команда в историю не была помещена, то любая следующая команда сделает невозможным вызов предыдущей при нажатии вверх. К примеру, <Space>echo I do not want this in history<CR><Up> покажет <Space>echo I do not want this in history, тогда как <Space>echo …<CR><CR><Up> — уже нет (из‐за двух <CR>).

        Единственное но: я не знаю, как в zsh одной настройкой убирать из истории команды, начинающиеся с пробела. У меня для этого есть функция zshaddhistory:
        function zshaddhistory()
        {
            emulate -L zsh
            if (( ${+_HISTLINE} )) ; then
                print -sr -- "${_HISTLINE}"
                unset _HISTLINE
            elif (( 0x20==#1 )) ; then
                return 1
            else
                print -sr -- "${1%%$'\n'}"
            fi
            fc -p
        }
        . Она же ответственна за подмену истории в некоторых случаях (именно для этого здесь находится первое условие с _HISTLINE).
        Насколько мне известна, такая настройка всё же существует.
      • +1
        поробуйте Ctrl-R
  • +8
    Запуск последней команды под root.
    Главное – вовремя вспомнить, что там было.
    Если рейтинг самых опасных команд был, можно было бы дать первое место.

    Голосую за
    <пробел>команда
    • +1
      Если включить опцию histverify, вы сможете увидеть развернутую комманду перед исполнением. Всячески рекомендую.
      wiki.bash-hackers.org/internals/shell_options#histverify
      • 0
        Я делаю !:p — модификатор «p» выводит команду полученную в результате history expansion, но не выполняет её. А в zsh можно просто после "!!" нажать tab.
        • +1
          Ну и все модификаторы, если кому интересно:
          !:

          & — repeat substitution
          A — absolute path resolving symbolic links
          Q — strip quotes
          a — absolute path
          e — leave only extension
          g — globally apply s or &
          h — head — strip trailing path element
          l — lower case all words
          p — print without executing
          q — quote to escape further substitutions
          r — root — strip suffix
          s — substitute string
          t — tail — strip directories
          u — upper case all words
          x — quote words, breaking on whitespace
    • 0
      Хм, на консоле и написано, что вы вводили до этого. вы как раз же и используете "!!" что бы не было ошибки доступа, или у вас на столько короткая память?
  • +8
    Readline и zle (навигация в консоле) используют те же комбинации клавиш, что и emacs.
    Ctrl-p — предыдущая комманда (previous)
    Ctrl-n — следующая комманда (next)
    Meta-backspace (meta это обычно alt) — удалить слово.
    Meta-b — на слово назад (backward)
    Meta-f — на слово вперед (forward)
    И так далее, намного удобнее, чем использовать стрелки, если вы умеете печатать вслепую. www.bigsmoke.us/readline/shortcuts

    Бонус:
    Meta-. (dot) — последний аргумент предыдущей комманды, очень полезно если вы выполняете несколько комманд на одном и том же файле с длинным путем, например.

    Кстати, на маке C-p и С-n работает во многих приложениях: поиск в омнибаре Chrom'а, редактирование в Skype, Alfred, etc.
    • 0
      главное что бы вимер какой-нить в конфиг set -o vi не вставил ^_^
      • 0
        Ну почему же? Те, кто это делают, уж точно знают vim'омские shortcut'ы, которые, возможно, даже удобнее.
      • 0
        О, спасибо, не знал, что так можно.
    • +2
      неужели ctr+p/n удобнее стрелочек?
      • 0
        А вы попробуйте. Как страшный сон забудете что такое стрелочки =)
        • +3
          Подтверждаю, после емакса перемещение курсора стрелками вызывает фантомную боль.
      • 0
        Да, но только если вы печатаете десятипальцевым методом — не нужно отрывать руку от клавиатуры.
        • 0
          Да хоть полторапальцевым, разве лишние движения сопутствуют продуктивности?
          • 0
            В том и дело, что лишние движения — перенос руки к стрелкам. Ctrl нажимается краем ладони, P безымянным пальцем, — всё не отрывая рук от клавиатуры. Поэтому в Emacs (а стандартный режим bash именно оттуда) и vi(m) есть свои клавиши/комбинации для передвижения по строкам.
            • 0
              Ну так я про это и говорю =)
              а минусуют те, кто даже не пробовал перейти полностью со стрелочек. Потом на них сложно вернуться. Num-pad тоже биндится на правую буквенную часть с какой-нить Win-key, и правая часть клавиатуры со своими стрелочками и цифрами вообще становится ненужной.
            • +2
              Свои комбинации там есть потому, что не на всех клавиатурах были клавиши со стрелками.
      • 0
        Там же написано, кроме Ctrl+p/n у вас руки лежат на клавиатуре и вы готовы делать также Ctrl+f/b, Alt+f/b, Ctrl+a/e, Ctrl+r и так далее. Ну и да, не нужно перемещать руки к стрелочкам, смешивая эти нажатия с вводом команды.
      • +1
        В zsh, если добавить опции
        bindkey '^P' history-beginning-search-backward
        bindkey '^N' history-beginning-search-forward
        то можно не перебирать всю историю в поисках какой-то опции для команды, а ввести несколько первых букв и нажать Ctrl+P -> будут подставляться только те команды, что начинаются с этих букв.
        Пользуюсь для нахождения вариантов кодирования видео mencoder'ом — для компа, для ДВД-плеера, для телефона, для увеличения громкости и т.д.
        • 0
          Нуу… в bash-е жмете Ctrl+r и спокойно набираете произвольную часть команды — выфильтруется из истории, переключаться между подошедшими можно опять-таки по Ctrl+r
    • +4
      Ctrl+A и Ctrl+E (начало/конец строки) не забудьте
      • 0
        К сожалению, Ctrl+a не дружит со screen'ом.
        • 0
          В screen работает «Ctrl+a a»
    • 0
      К сожалению, некоторые полезные комбинации конфликтуют между собой. И это не проблема конкретных приложений, поскольку комбинации легко поменять, а конфликт идеологический — на уровне схем раскладок: readline, терминал, текстовый редактор.

      Например, к вышеприведенному списку readlin'а можно добавить следующие комбинации:
      C-a и C-e — переход в начало и конец строки, соответственно,
      C-r и C-s — интерактивный поиск (isearch) в истории команд назад и вперед, соответственно (кстати, это намного полезный C-p и C-n, реально увеличивает производительность).

      Но C-a по умолчанию используется в screen'е, а C-s блокирует вывод на терминал (а комплиментарная ей C-q разблокирует). Впрочем, в данном случае настройки скрина можно безболезненно изменить (поскольку это сравнительно новая программа, и ее комбинации не являются исторически значимыми ;) ), а блокировку терминала вообще выключить, поскольку она очень редко нужна.
  • +13
    Странно, что не упомянули brace expansion. Имхо, оно куда удобнее всяких сомнительных alt + esc.
    Работает примерно так:
    cp very_long_filename.{old,new}_ext


    А через set -o vi можно переключиться в vi режим оболочки. Иногда это здорово экономит время, и редактор запускать не надо (:

    Да и вообще, если доки почитать, там столько интересных вещей (:
    • 0
      Как ни странно, часто использую ALT+. Удобно, к примеру, в случае когда посмотрел содержимое файла с помощью cat/head/tail и решил его отредактировать. Всё пытаюсь найти аналог этой команды в режиме vi, только из-за неё не перехожу на него.
      brace expansion — да, тоже полезно.
      • 0
        Эта функция называется insert-last-word. Вы можете ее забиндить штатными средставами. Например, для ZSH и insert mode:
        bindkey -M viins "^[." insert-last-word
  • +18
    А еще многие не знают про поиск в истории команд: ctrl+r
    • +4
      Тут могло бы быть много слов радости, восторга и благодарности, но боюсь слова способные передать все мои чувства еще не придумали.
      • +7
        Правда? Тогда на всякий случай добавлю.
        Для продолжения поиска нужно повторно нажимать ctrl+r.
        т.е
        git push origin
        git push another

        ctrl+r git push ctrl+r даст git push another
        • +2
          Поиск по ^R в баше (вернее, readline) сразу меркнет на фоне поиска «стрелочками» вверх-вниз, но не по всей истории, а с учетом набранных первых символов (т.е. набрав foo и стрелку вверх, я попаду не на просто предыдущую команду, а последнюю команду, начинающуюся на foo). В tcsh (для многих — шелл по умолчанию во FreeBSD) это работает сразу, «из коробки». Чтобы не чертыхаться на линуксах научить этому bash, достаточно дописать пару строк в ~/.inputrc:

          "\e[A": history-search-backward
          "\e[B": history-search-forward
          • 0
            Красота! Спасибо огромное!
          • НЛО прилетело и опубликовало эту надпись здесь
            • +2
              У меня почему-то эти клавиши противно пищат и пишут тильды. :-) И потом, даже если их правильно забиндить, стрелочки как-то привычнее.
            • 0
              Нет, в bash так не работает по умолчанию.
              • –1
                У меня работало из коробки.
                • +1
                  Вопрос лишь в каком дистрибутиве — в каком-то могли и прокачать bashrc и inputrc.
                  • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Только это немного конфликтует со стандартным поведением стрелочек. Интересно, а можно ли прописать их вместе с каким-то модификатором? Например, ctrl? Я что-то и так пробовал и эдак — либо не работает, либо работает, но находит только один вариант, а дальше не работает.
            • 0
              Можно, конечно. Например, для случая с зажатым Ctrl коды клавиш «вверх» и «вниз» будут соответственно \e[1;5A и \e[1;5B. Для Alt — просто замените пятерку на тройку.

              Правда, я не очень понял, что вы имеете в виду под «немного конфликтует со стандартным поведением стрелочек». Если строка пустая, то перебинденные стрелочки будут работать как обычно. Или у вас какая-то более хитрая ситуация?
              • 0
                О, так заработало как надо. Только для меня почему-то эти escape последовательности так и остаются тёмным лесом. Пробовал делать по ману (man bash), но прописанное не работало.

                Да, конфликтует в другой ситуации. Была строка, редактировал её. Решил просто вернуться к прошлой версии из истории, нажал стрелку вверх — а в ответ тишина. Просто потому что похожей строки в истории нет. Нужно курсор перемещать ближе к началу.

                Но сейчас повесил на ctrl+стрелки, стало совсем хорошо.
  • +7
    Большое спасибо! Особенно за «cd -» — не знал.
    • +37
      Мало кто знает, что cd можно передать два аргумента, тогда это работает как replace. Например:
      $ pwd
      /home/me/project/beta/app/controllers
      $ cd beta production
      $ pwd
      /home/me/project/production/app/controllers
      • 0
        В 2.6.18 не работает :(
    • +5
      Еще pushd и popd
      • +3
        dirs -v — показать список запушеных папок.
        cd +3 — перейти в третью в списке.
  • +4
    Добавьте еще
    mkdir directoy && cd $_ # создание директории и переход в созданную директорию
    • +5
      А для временных директорий я сразу так делаю:
      cd `mktemp -d`
      
  • +6
    sudo !!
    Ну и что в этом хорошего? Выполнять команду от рута не видя её… Более того, если нечаянно выполнить такую команду из истории то по факту от рута нечаянно выполнится любая команда. И даже если посчитать по нажатию кнопок: Up Home s u d o пробел это ровно столько же нажатий, сколько и на набор этой команды! В общем, вредная команда, зря Вы её на первое место в рейтинге поставили.
    • 0
      Ну написано же: удобно, когда случайно забыл написать перед командой sudo.
      Вместо возвращения на прошлую команду, перехода к началу строки, добавлением к ней sudo, нажатия Enter, быстрее написать sudo !! <Enter> сразу же после получения Permission denied.
      Чего опасного то? Не думаю, что введя команду и получив Permission denied, кто-то тут же может забыть что он только что ввёл =).
      • +3
        ⬆, <Ctrl-A>, sudo, Enter
        • 0
          тогда уж <Ctrl-P>, <Ctrl-A>, sudo, <space>, Enter
          а за ⬆ ещё тянуться надо =)
          • 0
            А еще, если вы забывчивый, можно написать функцию (или скопировать из prezto)

            # Inserts 'sudo ' at the beginning of the line.
            function prepend-sudo {
            if [[ "$BUFFER" != su(do|)\ * ]]; then
            BUFFER=«sudo $BUFFER»
            (( CURSOR += 5 ))
            fi
            }
            zle -N prepend-sudo
            bindkey "^X^S" prepend-sudo

            Теперь вы можете добавлять sudo с C-x C-s.
            Работает в ZSH, для BASH нужно немножко подшаманить.

      • +2
        Нажать Up и Home всяко быстрее, чем Shift 1 Shift 1. :)
        • 0
          да не скажите
          за Up и Home далеко тянуться
          быстрее вместо них Ctrl-P, Ctrl-A использовать не перемещая рук с основной позиции
        • 0
          Почему? Shift+1 можно достать, не особо двигая кисти рук относительно основной позиции при слепой печати, а стрелочки и <Home> можно нажать, не двигая кисть только на небольших (ноутбучных и им подобных) клавиатурах.

          Только это всё равно менее быстро, чем <C-p>, заменяющее у меня <Up>; при том из‐за того, что <C-p> (как и <Up>) привязан к history-beginning-search-backward нажимать <Home> не нужно (в таком варианте позиция курсора при навигации по истории остаётся неизменной). Оболочка, конечно же, zsh.
          • +3
            Честно говоря аргумент про нежелание двигать кисть к стрелкам я никогда не понимал. В конце концов я не секретарша, набиванием текста на скорость не занимаюсь. Я программист и админ, и большую часть времени трачу на то, чтобы подумать или изучить ситуацию. А на набор собственно кода или команд в консоли уходит незначительный процент моего времени.

            И слепой набор здесь абсолютно не при чём — я им отлично владею больше 15-ти лет, а последние лет 7 у меня вообще была клавиатура без русских букв и стоящая под таким углом (Microsoft Natural Ergonomic 4000 с обратным наклоном) что и английские разглядеть было невозможно.

            Поэтому мне ничуть не мешает, что большую часть времени (пока я думаю, просматриваю код, изучаю состояние сервера, etc.) у меня рука лежит на стрелках (навигация по коду) или рядом (Shift+PgUp/PgDown при анализе вывода предыдущих команд в консоли). А когда я принял решение что делать и перешёл к набору текста — на основной клавиатуре. Наоборот, очень удобно, что разные виды деятельности связаны с разными положениями рук.
            • 0
              Я тоже часто использую PageUp/PageDown для навигации по коду в режиме размышлений. Но это не тот случай: если вам надо дописать перед командой sudo или что‐то в этом роде, то здесь другая логика: о необходимости изменений я узнаю немедленно по прекращению работы команды (т.е. либо она сразу завершается с ошибкой, либо я её убиваю по <C-c>, видя неправильный результат) и, как правило, у меня так же немедленно возникает идея, как её исправить. Немедленно. Если идея уже есть, то руки не должны меня тормозить. Со стрелками они тормозят. Разумеется, предполагается, что я не убирая руки с основной позиции. Не вижу причин убирать, если я знаю, что мог что‐то сделать неправильно.

              Второй, более частый, use-case: недописанные цепочки. Т.е. я проверяю, действительно ли, к примеру, grep выдаёт, то, что мне нужно; затем проверяю следующую команду в цепочке (она уже придумана, но пишется только после проверки предыдущей). Идея всех команд в голове уже есть. Зачем себя тормозить?

              Отмечу ещё, что чем лучше моё владение клавиатурой, тем менее мне нужны различного рода сокращения.
    • 0
      В истории она сохраняется в развёрнутом виде, так что что попало выполнить не получится.
    • 0
      Могу себе представить невозможность вспомнить последнюю команду только в одному случае: по ssh куда-то зашли спустя время, но первой командой делать sudo!!! это само по себе невежество, а не проблема удобства этой команды.
      Часто например aptitude update пишу без sudo, sudo!!! сильно облегчает жизнь.
  • +4
    Еще хорошая штука time. Пишешь time перед любой командой, после завершения получаешь время исполнения. Alt+P тоже отличная вещь. Вообще, все эти рейтинги весьма относительны…
  • +1
    Ctrl-A — вернуться в начало строки
    Ctrl-E — перейти в конец строки
    Ctrl-W — удалить слово перед курсором
    Alt-D — удалить слово после курсора
    Ctrl-U — удалить всю строку слева от курсора.

    Ctrl-R — поиск по истории команд

    Из самой статьи разве что reset узнал:)
    • +1
      Ctrl-K — удалить всю строку справа от курсора
      Ctrl-Y — вставить строку удаленную с помощью Ctrl-U
      • 0
        О, а вот про Ctrl-Y не знал. Спасибо!

        P.S. В zsh Ctrl-U вообще очищает всю строку.
        • 0
          да, есть такое, но легко исправляется:
          bindkey \^U backward-kill-line
    • +3
      <пишешь команду>
      — Ах, надо же сначала другую ввести!
      <Ctrl-U>
      <новая команда><Ctrl-Y><дописываешь команду>
  • +1
    Быстрый cd в любой подкаталог заданных:
    CDPATH=:..:~:~/projects
    
    • 0
      Можно пояснить, как пользоваться? Часто приходится прыгать по поддиректориям с либами.
      Смотрел push/pop и различные аналоги: github.com/joelthelion/autojump, пока не приучил себя пользоваться.
      • +1
        Разобрался. Просто экспортируем и делаем cd, будто находимся во всех директориях сразу.
        Крутейшая вещь! Автодополнение тоже работает по всем директориям.
  • +14
    узнать 10 наиболее используемых вами команд
    history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn |head -n 10
    
    • +7
      git побеждает с большим отрывом. =)
      • 0
        А мы, вот, из другого лагеря :)

        124 hg
        96 sudo
        63 mc
        20 ./full-update.sh
        18 ./full-push.sh
        17 php
        13 mcedit
        11 composer
        11 cat
        10 eix
    • 0
      Жутко бесит, когда помнишь, что набирал команду недавно, начинаешь скроллить, а там по 10 раз повторяются mc/reset/apt-get update. Настроил «убирать дубликаты» — в истории остаётся только самое последнее применение команды, остальные удаляются.
      В zsh
      setopt HIST_IGNORE_ALL_DUPS
      • 0
        о, я в прошлый раз в такой теме рассказывал про этот лайфхак: ctrl+a и добавляешь в начало команды # и она не отрабатывает т.к. превращается в комментарий но сохраняется в истории.
  • +2
    А у меня привычка смотреть вывод top / htop после каждого подключения к машине. Думал, нас много, удивился что в рейтинге ее нет.
    • +1
      У меня такая привычка сформировалась по очень простой причине: простаивающее соединение рвёт провайдер, а запуск чего-то, что постояно гоняло трафик, решало эту проблему, теперь уже машинально запускаю, даже если исходная проблема неактуальна :)
      • +2
        А увеличение KeepAlive для ssh-соединений разве не помогает? Либо ServerAliveInterval в конфиге ssh_config на клиенте, либо ClientAliveInterval в sshd_config на сервере. Этот вариант как-то правильнее, что ли :)
        • 0
          Давно поставил себе mosh и забыл о разрывах соединения как о страшном сне.
  • –1
    Родные, подскажите как в консоли поправить время в тегах фотографий. А то с отпуска приехал и осознал, что забыл в камере перевести время на 3 часа назад… И вроде бы, какая разница? — А вот что-то гложет меня, не могу успокоится. Фоток много…

    На море
    image
    • +3
      С помощью exiftool.

      Команда получается вроде такой. Могу ошибаться, проверьте на каком-нибудь одном файле, предварительно забекапив :)
      exiftool "-DateTimeOriginal-=0:0:0 3:0:0" DIR
  • +2
    Считаю, что в заголовке статьи (или хотя бы в ее тексте) нужно упомянуть, что все это относится к оболочке bash (я вот пользуюсь fish и многое здесь у меня не сработает).
  • 0
    Что сделать, чтоб заработало 'CTRL+X E'?
    • 0
      Попробуйте нажимать с зажатым Shift'ом. Зажимаем Shift+Ctrl, нажимаем X (не зажимая), нажимаем E. Работает в bash и zsh из-под коробки.
      • 0
        Сработало CTRL+SHIFT+X CTRL+SHIFT+E
        Что удобно, набираемая команда автоматически оказывается в редакторе.
        Спасибо :)
    • +3
      Возможно, у автора поста ошибка. Правильная комбинация не C-x e, а C-x C-e (то есть жать e, не отпуская Ctrl). А может, просто настройки баша по умолчанию различаются в разных дистрибутивах.
      • 0
        У меня и так, и так сработало. (ROSA / KDE / Konsole / bash)
  • 0
    По иронии судьбы знал только первое место
  • 0
    И спасибо за space команда. Я историю до этого дня чистил.
  • +2
    Хм, практически всё видел и использую.
    Здесь много команд с рейтингом: www.commandlinefu.com/commands/browse
    Подобное тому, что у ali_aliev (функция в ~/.bashrc): mkcd() { mkdir -p "$@" && cd $_; }
  • +1
    Еще бывают ситуации, когда поставил, к примеру, компилировать какую-то здоровенную программу, после чего понимаешь, что это займет очень много времени. Вместо того, чтобы открывать новую консоль или сеанс, можно смело нажать ctrl+z и написать в консоли bg — это переведет исполняющуюся программу в фоновый режим. Список задач можно посмотреть командой jobs.
    • +2
      ну уйдет оно в bg, а гадить-то на тот же экран продолжит.
      • 0
        У меня просто плохой пример). В основном использовал при копировании больших файлов, когда на экран ничего не выводится.
      • 0
        Чтобы этого избежать, можно воспользоваться nohup при запуске команды.
    • +2
      Тогда уж и про disown расскажите!
      • 0
        Отличная утилита, узнал бы я о ней на пару лет раньше, сэкономил бы массу времени.
        Опишу пример использования на всякий случай. Запустили вы в терминале некую команду scp, mv, rsync и т.д., она выполняется пока открыт терминал, если терминал закроется выполнение команды прекратится. В этом случае нам на помощь приходит команда disown, делаем следующее: запущенный процесс останавливаем Ctrl+Z и запускаем его в бэкграунде bg, далее пишем disown, процесс останется выполняться в фоне, без привязки к вашей текущей сессии, терминал можно закрывать. Команда бывает очень полезной если вы забыли запустить screen или tmux.
    • +1
      Когда пишу длинную и потенциально деструктивную команду, всегда ставлю # в начале, чтобы не наломать дров, нечаянно нажав ентер. Дописав и проверив, # убираю.

      Особенно часто спасает, когда команду копи-пастишь откуда-то — можно легко скопировать невидимый символ возврата каретки…
      • +1
        Можно нарваться, если копипастятся несколько строк. Первая-то закомментарится, а следующие выполнятся. Особенно весело будет, если скопированы две строки вида:
        export TEST=/tmp/some_path
        rm -rf $TEST/*
        
        • 0
          Отличный пример :)
        • 0
          Для пользователей zsh могу предложить для копирования и вставки использовать widget’ы:
          function _-insert-primary()
          {
              emulate -L zsh
              LBUFFER="${LBUFFER}$(xclip -o)"
          }
          function _-insert-clip()
          {
              emulate -L zsh
              LBUFFER="${LBUFFER}$(xclip -o -sel clip)"
          }
          zle -N insert-primary                    _-insert-primary
          zle -N insert-clip                       _-insert-clip
          bindkey  -M evi    "\C-r*"        "insert-primary"
          bindkey  -M evi    "\C-r+"        "insert-clip"
          
          . С ними вставка будет на <C-r>* (мышиный буфер) и <C-r>+ (обычный буфер) (как в vim). Комментироваться указанным способом будет всё равно одна строка, но есть важное отличие: при вставке таким способом команды не исполняются независимо от наличия или отсутствия в них каких‐либо символов, включая символ новой строки.

          При желании можно модифицировать widget’ы, чтобы все строки комментировались автоматически при наличии в начале строки #, но раскомментировать их потом будет не слишком удобно (если только не написать ещё один widget для раскомментирования).
    • 0
      можно еще screen юзать если нужно такое делать часто или автоматически.
  • +6
    Ctrl+R, на мой взгляд, может побороться за одно из первых мест.
    Сколько людей мучается, набирая «history | grep labuda».
    • +1
      Я даже алиас сделал :D
      alias hist='history | grep'
    • 0
      СTRL+S еще, реверсивный CTRL+R.
  • 0
    Alt + BackSpace — удалить слово в строке до разделителя
  • 0
    Мне понравилось про mtr, не знал, круто ведь.
    • 0
      А под windows есть замечательная winmtr.
  • +2
    Не знаю, подходит ли для этой темы, но вот что пригодилось мне:
    python -m smtpd -n -c DebuggingServer localhost:1025 #Отладочный smtp сервер
    cat <whatever> | python -mjson.tool #  печатает отформатированный json 
    ls music | sort --random-sort #перемешивание 
    bash -x #будет показана отладочная информация выполняющегося скрипти
    

  • +3
    xargs умеет параллелить процессы (-P / --max-procs):

    time echo {1..5} | xargs -n 1 -P 5 sleep
    
    real	0m5.007s
    user	0m0.004s
    sys	0m0.004s
    
    time echo {1..5} | xargs -n 1 sleep
    
    real	0m15.010s
    user	0m0.000s
    sys	0m0.004s
    


    Или используйте GNU Parallel
  • 0
    Полезный хоткей в баше чтобы сделать из строки типа ls * строку, где будет вместо * будет перечислено то, что подставится при выполнении:
    [esc] - *
    


    Удобно, когда нужно открыть каталог со сбившейся кодировкой. Пишем cd *, жмём этот хоткей, удаляем лишние каталоги, остаётся один, нужный нам. Еще можно использовать для того, чтобы удалить все файлы в каталоге, кроме одного.

    В zsh это делается просто нажатием на [tab].
  • –8
    Какое прикольное имя сайта: commandlinefu — его явно русскоязычный любитель графического интерфейса регистрировал! :) (Подсказка: commandline — фу!)
    • –7
      Я сам, лично, ничего плохого про командную строку сказать не хотел! Сам с удовольствием пользуюсь и считаю, что многие вещи в ней делаются гораздо быстрее и удобнее. ПРОСТО увидел это в названии сайта и решил, что это прикольно и кому-то даже настроение слегка поднимет. А тут зачем-то минусы пошли…
      • +6
        Очевидно же, что fu в данном случае от кунгфу.
  • +1
    mtr — вещь, не знал про неё.
  • +3
    Для Python 2.x:
    python -m SimpleHTTPServer [PORT]
    

    Для Python 3.x:
    python -m http.server [PORT]
    

  • 0
    cd -


    вот не знал про такую фишку, часто нужно в итоге пользуюсь историей команд, но так явно удобней.
    • 0
      popd
  • 0
    Для Ruby

    alias server='ruby -run -e httpd -- -p 5000 .'
    
  • 0
    !!$ — вставить последний аргумент из предыдущей комманды
    • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Почти всё знал, но особое спасибо за ^foo^bar — гениально!
  • +1
    Когда-то я узнал про history expansion и event designators, и уже не смог остановиться. Использовал !$ вместо Alt+., потому что до недавнего времени вообще не знал про такую комбинацию. Кроме !!, ещё очень часто использую !?substring — ищет в истории команду с заданной подстрокой. Иногда и модификаторами балуюсь. Что может быть проще, чем !?file.txt?:s//file.mp3 ?:)
  • 0
    Ну если уж на то пошло, то " > foo.txt" не обязательно создавать всегда пустой файл. Если вам нужно, например, пропарсить файл и создать из него новый, то можно сделать что-то подобное:
    cat foo.txt | grep "blah" > bar.txt
    Эта команда пропарсит первый файл и запишет во второй только те строчки, в которых есть "blah"
    • –2
      Так это же стандартное перенаправление: > с очисткой файла, >> — без. Основы, можно сказать.
      А то, что команду перенаправления можно использовать без указания источника, знают не все, т.к. в учебных пособиях про это обычно не пишут.

      Кстати, вместо touch a.txt вполне можно использовать > a.txt
      • 0
        Я согласен про основы. Просто подумал, что если кто найдет полезным > a.txt то и перенаправление пускай будет где-то в комментариях.
        • +1
          Кто-нибудь найдёт. Вообще комменты на хабре — полезнейшая вещь! Посмотрите, сколько полезных советов уже набралось :)
      • +3
        Не шутите так. touch не изменяет содержимое существующего файла, а > уничтожит текущее содержимое.
        • 0
          Это не шутка — сам часто так создаю файлы. Разумеется, с ней надо быть осторожней.
      • +1
        Как замена touch подойдёт >> a.txt.
  • +9
    Очень удобно глянуть календарик в консоли этой командой:
    cal
  • 0
    А как же без этой команды:
    yes "I love Habr"
  • 0
    Недостаточно кармы, поэтому просто спасибо )
  • +1
    к сожалению, почти все эти команды характерны для баша, о чём даже не упоминается в статье. Я исторически поклонник tcsh и у меня это не работает.
    Одна из моих любимых команд:
    sudo netstat -luntp
    показывает все открытые порты с использующими их приложениями
    • 0
      И для полноты картины:
      netstat -s
      netstat -ap | grep ssh
      netstat -c
      • +2
        netstat (как и ifconfig, и route) работают не совсем корректно в наше время — когда для настройки сети используются продвинутые фичи ядра через iproute2 — вот прикольный обзор на эту тему 5-ти летней давности: ifconfig sucks.
    • 0
      помню была такая фишка в tcsh — вводишь название команды, а потом стрелочкой выбираешь все предыдущие значения которые запускал этой командой, не знаете как это называется? очень не хватает
      • 0
        zsh также поддерживает такую возможность.
        • 0
          Вот, кстати, про эту возможность есть вопрос.
          Я с удовольствием пользуюсь этой возможностью на удалённых серверах, но на локальном хосте она у меня никогда не работает (тупо берёт последнюю команду из истории).
          Конфиг, естественно одинаковый и там и там (на основе oh-my-zsh). Почему оно может не работать не понимаю.
          • 0
            К сожалению, не могу помочь. Я настраивал конфиг сам и давно. Сейчас просто таскаю его, когда перехожу на другую машину. Поэтому уже подзабыл, что именно я правил.
          • 0
            А глобальный конфиг ( то есть /etc/zshrc ) не различается?
            • 0
              Я не юзаю глобальные конфиги, тем более на рабочих серверах :)
              У меня все в ~/.zshrc лежит, который, по идее, в любом случае должен перезаписывать глобальный конфиг.
              Все остальные штуки работают одинаково. Соответственно, предполагаю что дело не в конфиге, а в остальном окружении (Ubuntu 12.04).
          • 0
            Такое происходит, если в конфиге использовались escape‐последовательности, выдаваемые стрелочками, напрямую (или с использованием zkbd), а не получались тем же способом, каким их получает zsh.

            Я предполагаю, что для получения используется terminfo. Во всяком случае, echo $terminfo[kcuu1] выдаёт то, что выдают стрелочки (но у меня — не всегда: при использовании команды внутри Vim всё правильно, а внутри zsh — нет). Соответствие названий записей клавишам можно узнать в man terminfo.
      • 0
        Почему была, она и сейчас есть, это команды history-search-backward и history-search-forward. Во FreeBSD они забиндены на стрелочки по умолчанию, даже ничего настраивать не надо:

        bindkey -k up history-search-backward
        bindkey -k down history-search-forward

        Я там немного выше поделился рецептом, как такой же поиск по хистори прикрутить к bash.
        • 0
          спасибо Вам!!! плюсанул бы да не могу
          я тогда как раз на фряшечке и засидал)
    • 0
      netstat -plunt запоминается легче :)
      • +2
        А мне запомнился тюльпан: netstat -tulpan
        • 0
          Красиво, да. Но много лишнего показывает.
          • 0
            Можно тогда упрт варнт -tulpn
  • 0
    Замечательный скрипт для простой навигации. Можно ввести часть пути — и вы попадете в нужную директорию https://github.com/rupa/z
  • +5
    Блин из комментов нужно делать выжимку во 2 статью. Правда главное так не зациклиться
    • 0
      Точняк! :)
  • +2
    Недавно узнал как гуманно останавливать залипшую SSH сессию (например. в случае проблем с сетью) когда SSH клиент не реагирует на команды:
    <Enter>~. — закрывает SSH клиент и возвращает в консоль.
    Есть ещё несколько тильда-комманд для ssh — справку можно посмотреть по <Enter>~?
  • +9
    Если уж речь уже и просто о полезных утилитках, то недавно открыл для себя
    pstree
    На рабочем маке так себе, процессов уж очень много.

    А вот на серверах картинка очень красивая
    • 0
      Супер!
      Хром какой ветвистый-то :)
    • 0
      Утилита tree таким же образом показывает файлы.
  • –1
    Not safe for work!!!

    sudo killall5
    • –1
      del
  • 0
    Судя по статье 3-летней давности (которая перевод отсюда), топ-10 commandlinefu довольно стабилен — 5 из 10 команд совпало и там, и тут.
  • +3
    Ну раз тут про нетстат говорят, тогда нельзя без:
    ss -nlptu — чисто порты по запущенным процессам, с пидами, которые слушают tcp и udp
    ss state all — все текущие коннекты, часто полезно c '|wc -l' — подсчет строк
    ss state bucket — также полезно с подсчетом количества строк, в динамике и используя watch
    watch 'ss state bucket| wc -l' — просмотре всех недоустановленных соединений по tcp (TIME-WAIT|SYN-RECV) каждые 2 секунды, самообновляется.

    нельзя не забыть про мощный ip
    ip a
    ip r

    Если надо в дебиане при старте или дауне интерфейса что-то сделать — юзаем в /etc/network/interfaces команды up и down для нужного интерфейса. то есть должно выглядеть так:
    up ip ro a 10.0.0.1/32 dev eth1

    В терминаторе или айтерм можно сделать горизонтальные табы ctrl+D или cmd+D соответственно.
    Кстати, для vim открыть существующий файл рядом для ридонли:
    :vsp

    Нелья забыть о тулзе которая спасла много жизней
    iptables-save — показывает все примененные правила iptables.
    Если ее вывести в файл 'blabla.ipt' то востановится из него можно через cat ./blabla.ipt| iptables-restore

    также жизнеспасающая команда:
    lsof -p pid — показывает все открытые файлы процесса без утомительного грепаня по proc

    Если вы хотите запустить длительную команду на ночь так, чтобы потом посмотреть ее вывод — disown вас не спасет. Можно конечно вывести STDOUT и STDERR в файлы, но намного проще создать псевдотерминал тем же tmux или screen и в нем уже запустить команду.

    ls -A — показать все файлы в текущей директории, даже те, которые начинаются на '.', но без '.' и '..'

    ну и нельзя не вспомнить про башевские **
    ls ** — покажет все подкаталоги в первой итерации

    • 0
      Применять изменённые правила файрвола лучше не через iptables-restore, а через iptables-apply — особенно на удалённом сервере — так меньше шанс остаться после этого без доступа к серверу.
    • +2
      dtach -A /tmp/session.dt bash
      Ctrl + \ — detach
      Есть удобная команда 'dtach', которую иногда удобнее использовать вместо 'disown'. Она перенаправляет stdin/stdout в unix-сокет, к которому позже можно подключиться. На сокет можно настроить права на запись и чтение и несколько пользователей могут работать с сокетом одновременно. Очень удобно, если нужно, например, транслировать группе людей окно терминала. Есть патч, позволяющий работать с сокетом, доступным только для чтения.
  • 0
    а мне вот такое помогает часто из консоли копировать файлы
    scp -P 2299 file user_name@remote_server:~/ #скопировать на удалённый компьютер
    scp -P 2299 user_name@remote_server:~/file.txt ~/ # скопировать с удалённого компьютер в домашнюю директорию
    -P порт
  • 0
    немножко в сторону, все-таки сторонняя утилита, но очень рекомендую ncdu
    быстро строит древо использования места на диске
    • 0
      Благодарю :)
      Как то целенаправлено не искал, все по старинке,
      du -h
      du -sh
      Но так зачастую таки получше будет
  • 0
    Нашел по этой же тематике еще одну интересную статью — www.opennet.ru/base/sys/bash_tips.txt.html
  • 0
    И всё это отвратно работает в fish. С другой стороны, в fish'е оно все и не нужно.
    • 0
      Я бы так не сказал. Каждый раз, когда я смотрю fish мне там чего‐то не хватает. То $var:a:h (полное имя каталога, в котором находится файл из данной переменной), то математики (обёртка над bc — это совершенно не то: попробуйте поработать с шестнадцатиричными цифрами), то автодополнения (оно есть для гораздо меньшего числа команд, нежели в bash или zsh), то нормального разбиения на аргументы ((command) разобьёт по новым строкам, если вы не станете трогать IFS, причём в документации об IFS не написано ничего (единственное упоминание — в документации read)). Короче, моё впечатление:

      1. Zsh может всё, что делает fish.
      2. Кроме fish autosuggestions. Zsh их тоже теоретически может (есть даже набор скриптов для получения fish‐подобных подсказок), но только используя набор хаков.
      3. И подсветки. Она есть, она как бы работает, но для неё нет нормального парсера. Людям надо было писать его на perl или python, а не на zsh. Сейчас можно допилить pygments и взять мой zpython, но это более новый проект, чем zsh-syntax-highlighting.
      4. Кроме вышеуказанных двух пунктов в fish нет ничего хорошего. Привычные по zsh возможности для написания скриптов в fish либо отсутствуют полностью, либо требуют очень много текста.

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