Обожаю трюки и лайфхаки. Каждый раз радуюсь, когда удается упростить очередную рутинную операцию. А так как работаю я, вот уже 8 лет, веб-программистом, то рутинные операции и лайфхаки у меня программерские. Вот этим и хочу с вами поделиться.
Часть трюков до меня уже описали на хабре, часть я взял из других источников, часть придумал сам. Буду благодарен если в комментариях к посту вы напишете, какие трюки используете вы.

Использование ** в zsh


Таким образом я ищу файлы в папке по расширению рекурсивно:
ls **/*.json

файлы с размером выше чем 1 мегабайт:
ls -lh **/*(Lm+1)

Быстро и уверенно удаляем мусор из репозитория в python проекте и судорожно правим. gitignore:
git rm --cached **/*.pyc



Генерация. gitignore при помощи сервиса gitgnore. io


Сначала новая команда
 git config --global alias.ignore '!gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; gi'

и вот мы уже можем генерировать собственный файл. И больше никаких pyc файлов!
git ignore sass,node,python,django

Пользователям Windows немного сложнее

Oh-my-zsh в Windows


Если вы не хотите читать раздел из предыдущего трюка про Windows по причинам не связанным с использованием других операционных систем, то для вас у меня есть приятный сюрприз.
Babun — вполне себе приличная реализация эмулятора терминала. Из плюсов: интеграция с oh-my-zsh и пакетный менеджер.

Разбор bash выражения при помощи сервиса explainshell.com


Очень часто пользуюсь данным сервисом. Никак не могу запомнить значения флагов. Сервис может объяснить из чего состоит например вот такая штука:
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l 2>/dev/null; done

Быстрый запуск веб сервера из консоли


Чтобы запустить веб-сервер с корнем из текущей папки:
python -m SimpleHTTPServer 8000

или установить BrowserSync
npm i -g browser-sync && browser-sync start --server

PHP тоже работает
php -S 127.0.0.1:8000

и Ruby:
ruby -run -e httpd -- -p 5000.

и для любителей:
C:\> "C:\Program Files (x86)\IIS Express\iisexpress.exe" /path:C:\MyWeb /port:8000

Для правильной работы нужен установленный IIS и путь из корня.

Если этого разнообразия не хватило, то всегда можно найти еще

Показать клиенту результат своей работы, со своего компьютера при отсутсвии выделенного IP


Эта штука меня много раз выручала. Работает поверх SSH, создает поддомен по которому клиент может увидеть ваше веб-приложение. Работает довольно медленно. Но работает. Это главное. Есть еще нечто похожее, но платное.
Предварительно скачиваем бинарник с официального сайта. Заходим в папку с бинарником. Выполняем.
./ngrok http 3000

В ответ сервис пришлет домен, по которому приложение доступно из вне.

Использование алиасов в командной строке для работы с git.


В oh-my-zsh есть прекрасный плагин, который позволяет работать с git. Также он создает алиасы для часто используемых команд. Чтобы посмотреть полный список сокращений и их расшифровок можно сделать так.
alias | grep git


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

Полезности из комментариев



ungit — графический интерфейс с git
localtunnel.me — еще одна штука для привязывания внешнего домена через SSH, аналог ngrok
В bash тоже можно использовать синтаксис **, для этого нужно обновить версию Bash до 4.x и включить нужную опцию (shopt -s globstar)

Обновление 1: исправил ошибки, теперь все должно работать нормально
Обновление 2: добавил раздел с хаками пользователя

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


  1. pepelsbey
    27.09.2015 11:17
    +9

    Кажется вы оттипографили текст, теперь примеры нельзя скопировать и использовать:

    C:\> «C:\Program
    browser-sync start —server

    Кавычки, два дефиса в тире и т.п.


    1. extempl
      27.09.2015 11:37
      +5

      ещё '. gitignore' и пробелы в URL.


    1. zolotyh
      27.09.2015 20:31

      Исправил, спасибо!


  1. extempl
    27.09.2015 11:39
    +3

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

    Быстро и уверенно удаляем мусор из репозитория и судорожно правим. gitignore:
    Чтобы запустить веб-сервер с корнем из текущей папки:
    (хотя здесь, конечно, и так понятно из примера, но всё же, читается странно)


    1. mktums
      27.09.2015 15:05
      -5

      Вы бы ещё уточнили там где надо, что в примере речь идёт исключительно о Python

      Справедливости ради, Python есть практически везде.


    1. zolotyh
      27.09.2015 20:31
      +1

      Поправил! Спасибо!


  1. extempl
    27.09.2015 11:43
    +1

    Показать клиенту результат своей работы, со своего компьютера при отсутсвии выделенного IP
    Вот ещё: localtunnel.me

    А вот за explainshell.com спасибо.


  1. vintage
    27.09.2015 11:52
    +4

    Интересно, хоть когда-нибудь команды перестанут выглядеть как заклинания и требовать специальные сервисы для расшифровки?


    1. egorsmkv
      27.09.2015 11:57
      +4

      Уже: http://explainshell.com/


      1. vintage
        27.09.2015 20:35

        Уже что?


    1. zolotyh
      27.09.2015 21:20
      +1

      В эту сторону все и идет. Просто медленно. Поэтому появляются такие вот костыли как explainshell


  1. olegcorner
    27.09.2015 12:46

    Перефразируя Жванецкого:

    $ man find

    накроет ls как бык овцу.


    1. phikus
      27.09.2015 12:57
      +2

      Рекурсивный глоббинг делает find ненужным в 99% случаев


    1. zolotyh
      27.09.2015 21:12
      +1

      Я понимаю, что find гораздо мощнее и быстрее. Но как-то не складывается у меня с ним. Слишком много нужно запоминать по сравнению с ls.


      1. silvansky
        28.09.2015 11:52
        +1

        Зато есть

        -exec
        
        , что незаменимо при наличии пробелов в путях и именах файлов.


        1. Borz
          28.09.2015 12:37

          для простого поиска ls быстрее будет чем find. А вот для применения каких-либо действий на результат поиска да, find удобнее будет. Но при чём тут пробелы в путях?


          1. silvansky
            28.09.2015 13:24

            Для простого — да. А пробелы как раз мешают действия выполнять:

            ?  test  echo "file 1 contents"  > "file 1"
            ?  test  echo "file 2 contents"  > "file 2"
            ?  test  ls -al
            total 16
            drwxr-xr-x    4 valentine  staff   136 28 сен 13:21 .
            drwxr-xr-x  157 valentine  staff  5338 28 сен 13:20 ..
            -rw-r--r--    1 valentine  staff    16 28 сен 13:21 file 1
            -rw-r--r--    1 valentine  staff    16 28 сен 13:21 file 2
            ?  test  for file in $(ls); cat $file;
            cat: file: No such file or directory
            cat: 1: No such file or directory
            cat: file: No such file or directory
            cat: 2: No such file or directory
            ?  test  find . -type f -exec cat {} \;
            file 1 contents
            file 2 contents
            


            1. Borz
              28.09.2015 13:59
              +1

              $ grep IFS ~/.profile 
              export IFS=$'\t\n'
              

              избавит вас от проблемы с пробелами


              1. silvansky
                28.09.2015 14:01

                Но добавит проблем с другими вещами. Я так уже делал, но ведь иногда нужно иметь массив строк, разделённых пробелами. Да, я в курсе про трюк со временным изменением IFS, но это ведь задалбывает рано или поздно. =)


                1. Borz
                  28.09.2015 14:05

                  ну, всё зависит от того, с чем вы чаще сталкиваетесь в консоли — с проблемами пробелов в путях или с массивом строк :)


                  1. silvansky
                    28.09.2015 14:12

                    По совести сказать, примерно поровну. И првык уже юзать find как раз для разрешения проблем с путями. На автомате уже в скриптах пишу find -depth 1 -iname "*.png" вместо ls *.png. Кстати, IFS плох ещё и тем, что на сервере, где будет скрипт выполняться, он может быть задан иначе.


        1. youROCK
          28.09.2015 14:02
          +2

          Также есть -print0 и флаг -0 у xargs, что ещё полезнее :)


  1. phikus
    27.09.2015 12:59
    +3

    >Использование ** в zsh
    Баш не стоял на месте и в версии 4.х вдохновлённый zsh таки взял эту фичу(рекурсивный глоббинг) на вооружение


    1. Self_Perfection
      27.09.2015 13:44
      +4

      Уточнение: работа ** в bash регулируется опцией globstar, которая по-умолчанию выключена:
      shopt -s globstar


    1. AlexanderG
      28.09.2015 02:18

      Стандартный синтаксис глобов не поддерживался шеллом?..


  1. Anisotropic
    27.09.2015 13:37
    +2

    лайтовый веб-сервер:

    npm install -g http-server

    использовать: http-server [папка]

    гуй к гиту:

    npm install -g ungit

    использовать: ungit в папке с нужным репозиторием.


    1. mktums
      27.09.2015 15:08

      Это еще npm ставить надо…


      1. Anisotropic
        27.09.2015 16:55
        +1

        Само собой. У фронт-ендщиков, node как-правило уже стоит.


        1. mktums
          27.09.2015 23:24

          Логично :) Я например питонист, мне нода например не нужна, проще git instaweb использовать :)


          1. vintage
            28.09.2015 00:08

            А я нодист, но бинарные модули к ноде, внезапно, требуют gyp, который на питоне.


  1. seokirill
    27.09.2015 13:58
    +10

    Заявлено, что в статье будет информация о «JavaScript, HTML, CSS».
    А тут только про гит и консоль. Разочарован.


    1. feedborg
      27.09.2015 17:31
      -3

      Он еще и бояны запостил. Видимо человек находился в информационном вакууме и тут дорвался до хабра. Еще и вторую часть подобной чепухи писать собрался


      1. seokirill
        27.09.2015 18:24
        -2

        Хоть бы объяснил, чем пользуется, ато только строки, а куда их вводить и что для этого нужно, понятно не всем.


        1. olegkrasnov
          27.09.2015 18:36
          +6

          Начали появляться вебдевелоперы, не знающие про консоль.


          1. seokirill
            27.09.2015 18:39

            Я знаю про консоль и активно ее использую, но это не накладывает на меня обязательства знать, что такое zsh


            1. DeXPeriX
              27.09.2015 19:55

              Возможно, в статье не хватает метки Linux. Пробовали активно использовать консоль в какой-нибудь *nix-системе?


              1. seokirill
                27.09.2015 20:24
                +3

                У меня мак, сервак, который использую, на Debian7.
                Не то, что не хватает, она чуть ли ни единственная пригодная. Ну явно не HTML / JS.


              1. Borz
                28.09.2015 02:37

                использую и активно. а для пущей удобности ещё и guake установлен на рабочей станции


          1. feedborg
            27.09.2015 19:09

            Начали появляться веб-девелоперы, которые надергали комманды из старых постов на хабре и постят в виде откровений. Крутой лайфхак!


        1. zolotyh
          27.09.2015 21:17

          В качестве шелла стоит Z Shell, также использую Oh-my-zsh. Все это бежит на OSX.


    1. zolotyh
      27.09.2015 21:15

      Прошу прощения, что ввел в заблуждение. Есть что сказать и по поводу HTML, CSS, и JavaScript. К сожалению, в последний момент выпилил большой кусок, так как он тянет на отдельный пост.


      1. seokirill
        27.09.2015 22:03

        Публикуй, я как раз хотел про HTML / CSS хаки почитать, если они не заезженные.


  1. DeXPeriX
    27.09.2015 18:10

    Спасибо Вам огромное человеческое за Babun. Это именно то, чего мне так не хватало в Windows.


    1. xGromMx
      27.09.2015 23:21
      +1

      Посмотри еще на это msys2.github.io


  1. Borz
    28.09.2015 01:22

    Использование ** в zsh
    при чём тут zsh?
    и попробуйте найти командой «ls **/*.json» файлы, которые лежат не только во вложенных, но и в текущем каталоге. Уж лучше «find ./ -name *.json»

    Быстро и уверенно удаляем мусор из репозитория в python проекте и судорожно правим. gitignore:

    git rm --cached **/*.pyc
    кажется вы неверно понимаете поведение и смысл это команды.


    1. zolotyh
      28.09.2015 02:05

      при чём тут zsh?
      и попробуйте найти командой «ls **/*.json» файлы, которые лежат не только во вложенных, но и в текущем каталоге. Уж лучше «find ./ -name *.json»

      Сейчас еще раз попробовал, работает и для текущей папки.


      1. Borz
        28.09.2015 02:18

        да, в Bash из-за выключенного globstar разница в выдаче

        снимок