Russian (Pусский) translation by Anton L (you can also view the original English article)
В мае Nettuts+ выпустил замечательную статью под названием "7 простых и полезных хитростей командной стоки"; это была отличная статья для того, чтобы познакомиться, как работать с терминалом. Но вы можете узнать гораздо больше о том как использовать командный интерпретатор и я помогу вам подняться на следующий уровень в этом туториале!
Начнём
Если вы используете Mac OS X или ваш любимый дистрибутив Linux, вы уже готовы, можно приступать. Просто запустите терминал и следуйте инструкциям в данной статье. В том случае, если вы на Windows, что же, командная строка по умолчанию, совсем не тоже самое, нежели интерпретатор bash. Если вам хочется работать с более мощным инструментом командной строки, взгляните на Microsoft PowerShell; однако, команды, которые мы рассмотрим далее не будут работать. Тем не менее вы можете установить интерпретатор bash на Windows:
- Поставьте Cygwim, среда похожая на Linux для Windows.
- Установите msysgit; в зависимости от опций, которые вы выберите при установке, вы получите Git Bash, который сможет обрабатывать данные команды.
- Попробуйте Windows под-системы для приложений Unix. Хотя сам я это не тестировал, я понимаю, что вы получите интерпретатор Unix в итоге.
Отлично, давайте начнём!
1. Touch



Как разработчику, вам часто приходится создавать файлы. Если вы работаете из командной строки, обычно вы просто указываете имя файла вашему редактору:
$ mate index.html $ mvim default.css
Однако, временами у вас есть потребность создать один или несколько файлов, при этом не редактируя их. В этом случае вам поможет команда touch
:
$ touch index.html $ touch one.txt two.txt three.txt
Не правда-ли просто. Вообще, команда touch
служит для обновления доступа / даты модификации файла; это всего лишь полезное побочное действие, если файл не существовал он будет создан.
2. Cat и Less



Раз уж мы заговорили о файлах, вероятно в какой-то момент вы захотите увидеть содержание файла в терминале. Есть несколько команд призванных вам помочь в этом. Первая называется cat
; cat
означает "concatenate", команда не только показывает содержимое файла, у неё есть и другие функции; однако, мы разберём лишь этот момент. Принцип работы прост - передайте файл данной команде.
$ cat shoppingList.txt
Обратите внимание, в случае если файл слишком большой, для вас отобразиться лишь нижняя часть контента и вам придётся пролистать вверх, чтобы увидеть остальную часть. Конечно можно проскролить, но это не самый оптимальный вариант. Как насчёт less
?
$ less shoppingList.txt
Less гораздо лучше подходит для просмотра больших файлов в командной строке. Вы получите экран полный текста, но не более. Вы можете передвинуть его на строку вверх или вниз с помощью клавиш k
и j
и переместить окно вверх и вниз с помощью b
и f
. Можно искать определённое вхождение написав /вхождение
. Когда вы закончите нажмите q
, чтобы выйти из less
.
3. Curl



Так как вам, скорее всего, регулярно приходится работать с набором различных фреймворков, у вас есть необходимость каждый раз скачивать файлы подобных библиотек. Да, я знаю: вы можете скачать файлы из браузера, открыть нужную папку, распаковать и добавить нужное для вашего проекта, не кажется-ли вам, что это слишком много работы? Будет гораздо проще использовать командную строку. Для скачивания файлов, можно применить curl
; посмотрите на следующий пример:
$ curl -O http://www.domain.com/path/to/download.tar.gz
Флаг -O
сообщает curl
, что скачиваемая копия контента должен обладать тем же именем, что и удалённый файл. Если вы не передадите данный параметр, curl вероятнее всего просто отобразит файл в командной строке (предполагая, что это текст).
Curl инструмент с огромным функционалом, вам стоит взглянуть на страницу мануала (посмотрите ниже) в случае если кажется, что будете использовать эту возможность часто. Вот вам полезная хитрость, используем расширение квадратной скобки (bracket expansion) в интерпретаторе shell.
$ curl -0 http://www.domain.com/{one,two,three}.txt
Да, не правда-ли просто скачать несколько файлов из одного места, за раз. (Обратите внимание, что это не функционал curl, это функция относится к самому shell, так что можно использовать подобную нотацию и для других команд; перейдите по данной ссылке, если хотите узнать больше)
4. Tar и Gzip



Ну что же, теперь вы знаете как скачать необходимое при помощи командной строки; тем не менее, есть большая вероятность, что большинство файлов, которые будут скачены представляют из себя сжатые архивы с расширением .tar.gz (или .tgz). Что же нам с этим делать? Давайте отвлечёмся на секунду и разберём, что же значит "сжатый архив". Скорее всего вы уже знакомы с архивами. Вам довелось видеть .zip файлы; это один из типов архивов. В своей основе, архив - это один файл, который содержит в себе несколько файлов. Обычно архивы сжимают эти файлы, тем самым конечный файл занимает меньше места на диске, чем все файлы вместе взятые. Однако, вы можете ещё дальше уменьшить результат сжав сам архив ... и вот здесь то мы и сталкиваемся с gzip. Gzip - одна из форм сжатия.
Вернёмся к скаченным файлам. Они были обработаны tar (заархивированы)? после чего сжаты gzip. Вы можете разжать их (unzip) после чего разархивировать tar, но мы хотим всего лишь несколько раз нажать на клавиши, не правда-ли? Вот что мы сделаем:
$ tar xvzf download.tar.gz
Подождите, что? Разберёмся: была запущена команда tar
с флагами xvzf
(обычно нужно добавить тире перед ними, но это опционально). Флаги означают:
-
x
сообщаетtar
, что мы распаковываем (extracting), не архивируем -
v
даёт знатьtar
, что нам потребуется подробный (verbose) вывод (информация об исполняемом действии) -
z
сообщаетtar
, что файл был сжат gzip (тем самым файл будет разжат). -
f
сообщаетtar
, что мы будем использовать название оригинального архива.
Если вы хотите создать архив с gzip, вам всего лишь надо заменить флаг x
на c
(чтобы создать - create архив). Флаги v
и z
опциональны: вам нужен вывод? что насчёт gzip? Конечно вам следует оставить f
; так как понадобится имя файла для нового архива (в противном случае результат будет выведен в командную строку). После этого передайте команде все файлы, которые хотите добавить в архив.
$ tar cvzf archive.tar.gz index.html css js auth.php $ tar cvzf archive.tar.gx *.txt
Ну и напоследок, я упоминал, что вы можете обработать архив gzip (или какие-либо другие файлы) индивидуально; когда вы это делаете, gzip заменяет оригинальный файл gzip версией. Чтобы разжать gzip, добавьте флаг -d
(decompress).
$ gzip something.txt $ gzip -d something.txt.gz
5. Chmod



Другие действия, которые часто приходится выполнять веб-разработчикам - это изменения прав доступа к файлу. Есть три типа прав доступа, которые можно задать, и есть три класса, которым можно задать данные права доступа. Права доступа - чтение (read), запись (write) и исполнение (execute); классы - пользователь (user), группа (group) и другие (others). Обычно пользователь является владельцем файла, который он создал. Может существовать группа пользователей и класс group указывает на права доступа для пользователей в этой группе, пользователей, которые могут взаимодействовать с файлом. Соответственно, others класс включает всех остальных. Только пользователь (владелец файла - owner) и супер пользователь могут изменять права доступа к этому файлу. Ах да, и всё что было описано, работает точно также с директориями.
Так как же нам задать эти права доступа? Команда для этого chmod (change mode). Есть два способа сделать это. Для начала, этого можно добиться с помощью восьмеричной нотации; немного не понятно сперва, но как только вы к ней привыкните, заметите, что она быстрее. Выглядит это примерно так, исполнение соответствует 1, запись 2, а чтение 4. Вы можете их сложить для получения нескольких прав доступа: чтение+запись = 6, чтение+запись+исполнение = 7, и так далее. Тем самым для каждого класса существует соответствующее число, выстройте их в ряд и вы получите трёхзначное число для пользователя, группы и всех остальных. К примеру, 764 предоставит пользователю все права доступа, группе возможность чтения и записи и всем остальным - чтение. Чтобы понять лучше советую вам ознакомиться со статьёй на Wikipedia.
В том случае, если вам сложно запомнить восьмеричную нотацию, вероятно символическая нотация покажется проще (хоть она и требует больше нажатий по клавишам). Для этого вы будете использовать 'u', 'g' и 'o' для пользователя, группы и всех остальных ('a' для всех классов). В то время как 'r', 'w' и 'x' для чтения, записи и исполнения. Ну и наконец операторы '+', '-' и '=' чтобы добавить, убрать и установить права доступа в абсолютной форме. Вот как следует использовать символы: класса, оператора и прав доступа. К примеру, u+rwx
добавляет все права доступа для класса пользователя; go-x
убирает право запускать файл для группы и всех остальных; a=rw
всем классом позволена запись и чтение.
Теперь, чтобы использовать всю эту теорию в командной строке, начните с команды (chmod
), далее добавьте права доступа, после чего файлы и директории:
$ chmod 760 someScript.sh $ chmod u=rwx g+r o-x dataFolder
6. Diff и Patch



Если вам доводилось работать с системой контроля версий такой как Git или Subversion, вы знаете насколько они могут быть полезными, в случае если вы хотите поделиться проектом с другими разработчиками, или просто отслеживать версии. Но что если у вас есть потребность показать другу обновления в одном файле? Или другой разработчик отправил вам электронное письмо с новой версией файла, который вы редактировали с того момента, как получили последнюю копию? Иногда можно обойтись без полноценной системы контроля версий, но вам всё же нужен какой-то небольшой инструмент. Что же, как обычно поможет командная строка. Понадобиться команда diff
. Прежде чем вы сделаете какие-либо изменения в файле, скопируйте файл, чтобы у вас "на руках" был оригинал. После обновлений, запустите diff
; если не отправить вывод в файл, вывод будет отображён лишь в командной стоке, так что добавьте >
, затем имя файла:
$ cp originalFile newFile $ vim newFile #edit newFile $ diff originalFile newFile 1c1 < This is a sentence. --- > This is a short sentence. $ diff originalFile newFile > changes.patch
Как можно заметить, diff
использует обычный текстовый файл с синтаксисом, который будет понятен командам diff
и patch
. patch
? Команда, которая работает рука об руку с diff
. Если вы получили новый файл, вам потребуется обновить оригинал:
patch originalFile2 changes.patch
Теперь всё обновлено.
7. Sudo



sudo
не похожа на остальные команды, но она пригодится по мимо углубления в мир работы с командной строкой. Представьте такой сценарий: есть вещи, которые обычные пользователи не должны делать в командной строке; легко совершить непоправимые ошибки. Единственный пользователь, у которого есть на это права - супер пользователь, или root. В тоже время, небезопасно находится постоянно в системе в качестве супер пользователя, в связи со всеми доступными ему привилегиями. Вместо этого можно воспользоваться командой sudo
(super user do), чтобы предоставить права root для одной единственной команды. Вам потребуется ввести пароль от аккаунта супер пользователя, после чего система выполнит команду.
К примеру, установка ruby гема требует прав супер пользователя:
$ gem install heroku ERROR: While executing gem ... (Errno::EACCES) Permission denied - /Users/andrew/.gem/ruby/1.9.1/cache/heroku-1.9.13.gem $ sudo gem install heroku Password: Successfully installed heroku-1.9.13
8. Man



Большинство команд, которые обрабатываются интерпретатором bash, довольно гибкие и у них есть множество скрытых возможностей. Если вы предполагаете, что команда может сделать то что вам требуется или хотите ознакомиться с инструкцией по использованию команды, самое время обратиться к мануалу или так называемым man страницам. Просто напишите man
, затем команду, которая вас интересует.
$ man ln
Можно заметить, что man страница открываются благодаря less
.
9. Shutdown



Когда вы закончили свою работу, можно даже выключить свой компьютер из командной строки. Потребуется команда shutdown
, а также sudo
для её выполнения. Нужно передать команде один флаг или два; обычно используется -h
для передачи сигнала остановки системы (halt), -r
для перезагрузки, -s
для переход в режим сна. Далее передаётся время, когда это должно произойти: now
, +количествоМинут
или yymmddhhmm
(год, месяц, день, час, минуты). Наконец, вы можете передать сообщение, которое будет показано пользователю, когда действие будет совершено. Если я хочу отправить мой компьютер "спать" через полчаса, я запущу:
$ sudo shutdown -s +30
10. История, !! и !$



Так как командная строка призвана повысить нашу эффективность, должна быть возможность повторить ранее использованные команды. Есть несколько способов сделать это. Для начала используйте команду history
, чтобы получить список недавно используемых команд. Далее, чтобы выполнить их, напишите восклицательный знак и номер необходимой команды в истории.
$ history ... 563 chmod 777 one.txt 564 ls -l 565 ls 566 cat one.txt ... $ !565
Согласен, это плохой пример, так как мне приходится печатать больше символов для использования истории, нежели повторный запуск самой команды. Но как только вы начнёте комбинировать команды в длинные строки, данный подход будет гораздо быстрее.
Быстро получить доступ к последней команде и последнему используемому аргументу. Для предыдущей, последней команды используйте !!
; часто потребуется добавлять sudo перед этим. Для получения последнего аргумента, вам понадобится !$
; пожалуй переход в новую директорию, будет хорошим примером. В обоих случаях интерпретатор покажет полную команду, чтобы вы видели, что выполняете.
$ gem install datamapper ERROR: While executing gem ... (Errno::EACCES) Permission denied - /Users/andrew/.gem/ruby/1.9.1/cache/datamapper-1.0.0.gem $ sudo !! sudo gem install datamapper Password: Successfully installed datamapper-1.0.0 $ mkdir lib $ cd !$ cd lib
Заключение
Если вы такой же фанат повышения продуктивности, как и я, идея использования, по полной, командной строки должна вас заинтересовать. То что я показал всего лишь пример встроенных команд ... далее, есть много чего, что можно установить (посмотрите на менеджер пакетов homebrew, к примеру) Но возможно вы и так уже являетесь опытным пользователем командной строки, в этом случая поделитесь интересной командой с остальными. Напишите их в комментариях!