Великий и ужасный Terminal


Технологии Apple, великий и ужасный Terminal

Добрый день читатели Lapplebi.com, я решил написать пилотный обзор посещенный Терминалу и его приложениям. Если вас порадует то, что находиться под катом, то я продолжу излагать свой опыт в серии статей про великую и ужасную консоль.


Начнем пожалуй с самого начала, штатный терминал ужасен, минимум настроек и максимум геморроя, таким аскетам как я на это наплевать но для более комфортной работы желательно, что нибудь получше. Я долго искал замену штатному терминалу и нашел вот это — iTerm2 (кстати оно абсолютно бесплатно)


Приложение Terminal и (или) любое другое приложение для работы с консолью по сути дела является обыкновенной пускалкой оболочки Shell. Стандартный шелл в маках это bash как и в линуксах так и много где в Unix like системах.


Прежде чем мы начнем обзор CLI интерфейса (Command LIne Interface — Интерфейс командной строки), стоит упомянуть, что любой запускаемый процесс открывает три потока:


0 — Поток ввода.
1 — Поток вывода.
2 — Поток вывода ошибок.

Почему счет начинается с нуля думаю не стоит объяснять. И так дальше как только iTerm2 или Terminal запустили bash они все три первых потока ( 0 1 2 ) переключают на себя и там самым что вы введете в графическом приложении будет отправлено процессу bash, и так же то что будет выведено по потокам 1 и 2 будет отображено в нашем терминале.


Все исполняемые команды в терминале ( bash-e ) по сути дела являются отдельными приложениями, и что бы в этом убедиться наберите


whereis ls

и на выводе увидите нечто подобное

ul80jt-mdm:~ mikedm$ whereis ls
/bin/ls


команда (приложение) whereis — позволяет найти путь до запрашиваемого приложения.
команда clear — очищает экран терминала.
pwd показывает текущее местоположение в файловой система
ls — показывает список файлов и каталогов из текущего местоположения ( имеется ввиду простой запуск без параметов, про передачу параметров это чуть позже.)
cd — сменяет текущее положение на то что указанно в параметрах.

Параметры, что это такое и с чем это едят:
Параметры, или аргументы позволяют запустить приложение в различных режимах, для примера введите вот это

ls

и вот это

ls -la

и увидите разницу, так вот то что было написано после ls это и есть параметры, параметров может быть несколько. Каждый параметр отделен от другого пробелом, если внутри параметра необходимо указать пробел либо весь параметр берут в кавычки либо экранируют пробел эскейпт последовательностью

вот пример с несколькими параметрами:

curl -C - -L -O

сколько же тут параметров? А вот столько сколько пробелов, то есть 5.

clear — очистка экрана
pwd — текущий путь
man — показать помощь по приложению (man ls) кстати для того, что бы покинуть просмотр справки надо нажать клавишу q
cd — сменить каталог ( путь до каталога указывается в параметрах )
ls — отобразить список файлов и каталогов
mkdir — создать каталог
cp — копировать ( последний параметр — куда копируем, предпоследний параметр, что копируем: пример

cp file.txt /Users/mikedm/tmp/file.txt

mv — переместить, работает так же как и cp только после копирования удаляется источник.
uname -a = выведет информацию о системе ( подразумевается версия ядра и где запущенна и как собрана )
id — покажет с правами какого пользователя вы сейчас работаете.
пример:

ul80jt-mdm:~ mikedm$ id
uid=501(mikedm) gid=20(staff) groups=20(staff),404(com.apple.sharepoint.group.3),204(_developer),100(_lpoperator),98(_lpadmin),81(_appserveradm),80(admin),79(_appserverusr),66(_uucp),61(localaccounts),12(everyone),401(com.apple.access_screensharing),403(com.apple.sharepoint.group.2),402(com.apple.sharepoint.group.1)


и после повышения привилегий до root пользователя с помощью sudo -s мы увидим вот это:

uid=0(root) gid=0(wheel) groups=0(wheel),404(com.apple.sharepoint.group.3),204(_developer),100(_lpoperator),98(_lpadmin),80(admin),61(localaccounts),29(certusers),20(staff),12(everyone),9(procmod),8(procview),5(operator),4(tty),3(sys),2(kmem),1(daemon),401(com.apple.access_screensharing),403(com.apple.sharepoint.group.2),402(com.apple.sharepoint.group.1)

уточню разницу: uid в первом случае 501 — это мой пользователь, а точнее его номер. Во втором случае uid равен нулю, а это значит что работаем с правами самого самого привилегированного пользователя. У этого пользователя нет ограничений. Он может все, он местный бог. Поэтому прежде чем ввести команду с правами root пользователя — положите руки под жопу и десять минут подумайте, правильную ли вы команду ввели или нет, и вообще зачем ее выполнять. С дуру как говориться можно и kaco сломать.


date — выводит текущую дату и время
rm — выполняет удаление файла или каталога. будьте очень внимательны, данная команда выполняет удаление минуя корзину. И если вы ее выполняете под рутом то можете из за неправильно введенных параметров удалить совсем не то, что желаете.


Перейдем к списку вкусностей терминала, а точнее shell ( оболочек, их много на самом деле, вот небольшой список самых известных — sh, bash, csh, ksh итп).


1) перенаправление потоков.
2) конвейеры.
3) скриптинг.

Сегодня рассмотрим только первую вкусность «Перенаправление потоков»


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


1 — открывает терминал и вводим там:
cd ~

— данная команда переместит вас по файловой системе в домашний каталог. по сути дела является сокращением команды

2 — вводим
pwd

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

3 — вводим
mkdir tmp

— создаем каталог tmp. В дальнейшем мы будем проводить свои опыты именно в этом каталоге, следующей командой мы туда перейдем

4 —
cd tmp

— как я уже неоднократно писал, команда cd это смена текущего каталога, в нашем случае мы перешли из текущего каталога в его подкаталог с именем tmp, тоже самое можно было сделать из любого места сразу прыгнув вот либо так
cd ~/tmp

либо вот так
cd /Users/МОЙПОЛЬЗОВАТЕЛЬ/tmp

либо еще вот так
cd $HOME/tmp

Маленькая сноска, если вы выбрали в параметре перехода несуществующий путь то на поток вывода ошибок ( сиречь терминал ибо по умолчанию поток 2 выводиться на поток 1) будет выведено примерно вот это


ul80jt-mdm:~ mikedm$ cd ldsakfjasdl
-bash: cd: ldsakfjasdl: No such file or directory


что переводится примерно так: Нет такого файла или каталога.

Любое приложение после того как закончило работать возвращает код выхода, если оно закончило удачно работать то на выходе будет «0», в противном случае будет выведен номер ошибки. его можно посмотреть введя вот это после того как наше приложение отработает:


echo $?

вот пример с неправильным переходом в несуществующий каталог:
ul80jt-mdm:~ mikedm$ cd /adsfhsadf/asdfjlsadkfj
-bash: cd: /adsfhsadf/asdfjlsadkfj: No such file or directory
ul80jt-mdm:~ mikedm$ echo $?
1
ul80jt-mdm:~ mikedm$ cd ~/
ul80jt-mdm:~ mikedm$ echo $?
0


Думаю тут все предельно ясно. и перейдем к следующей команде:
5 — создадим пустой файл:
touch test.txt

— простая команда создающая простой пустой файл. аналогом данной команды является
echo "" > test.txt
.


6 — вводим
ls

— эта команда должна вывести список файлов и каталогов по пути в котором мы сейчас находимся и увидеть мы там должны только test.txt файл.

7 — введем теперь вот это
ls -la

— это тоже самое, что и в предыдущем шаге, но более подробный вывод в виде списка отображающего еще и скрытые файлы. ( скрытый файл это файл имя которого начинается с точки, если вы введете
ls -la ~

то увидите очень много таких файлов и каталогов, это служебные файлы и каталоги которые не нужны обыкновенному пользователю. )

вот что получилось в моем случае при вводе команды на 7 шаге:
ul80jt-mdm:tmp mikedm$ ls -la
total 0
drwxr-xr-x 3 mikedm staff 102 23 май 00:01 .
drwxr-xr-x+ 48 mikedm staff 1632 22 май 15:14 ..
-rw-r--r-- 1 mikedm staff 0 23 май 00:01 test.txt


обратите внимание на волшебные -rw-r--r-- и drwxr-xr-x+. это не просто последовательность символов, это права доступа к файлу или каталогу, мы сейчас быстро пройдемся по этой теме, более подробно думаю можно будет загуглить.


первый символ это тип файла d обозначает то, что это каталог (directory) — обозначает, что это простой файл. три по три символа «rw-» "-r-" и "-r-" это атрибуты доступа к файлу:
первый это права доступа хозяина файла
второй это права доступа группы этого файла
третий это права доступа всех остальных пользователей системы.
. последний символ указывает на наличие ACL у файла или каталога (ACL Access Control List — грубо говоря это список доступа)
ACL используется только тогда, когда стандартных unix прав доступа недостаточно и необходимо добавить несколько хозяев для файла или несколько групп.

r — доступ на чтение.
w — доступ на запись
x — доступ на исполнение ( у файла, но для каталога это будет разрешение на переход в этот каталог)

если у файла есть ACL то его можно поглядеть с помощью ls
ls -le ПУТЬ_ДО_ФАЙЛА

теперь под итожим "-rw-r--r-- 1 mikedm staff 0 23 май 00:01 test.txt":
к файлу test.txt созданному 23 мая в 00 часов 01 минуту с размером в 0 байт, хозяином которого является пользователь mikedm и группа staff разрешен доступ на чтение и запись для хозяина и только чтение для группы и только чтение для всех остальных.

Про то как задать права доступа к файлу или каталогу я расскажу в следующий раз, а сейчас мы наконец перейдем к фокусам пренаправления потоков.


8 — введем вот это:
echo "hello" > test.txt

— команда echo выводит на стандартный поток вывода ( номер 1 если вы помните) содержимое первого аргумента, то есть
echo "hello"

просто выведет hello, вот как это выглядит в моем примере:
ul80jt-mdm:tmp mikedm$ echo "hello"
hello


Но на 8 шаге мы к этому еще добавили "> test.txt"

Это и есть перенаправление потоков. есть два направления из приложения и в приложение, то есть мы 0 или 1 поток перенаправляем. в нашем примере мы поток номер 1 перенаправляем в файл test.txt, и все что было бы показано echo будет записано в файл. Убедимся в этом на 9 шаге.


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

Тоже самое только в обратном направлении можно передать в 0 поток и >>.

9 — введем
cat test.txt

— команда cat выводит содержимое всего файла в 1 поток, проще говоря все содержимое файла будет показано в текстовом виде, ВНИМАНИЕ если вы сделаете cat на бинарный файл, то может произойти, что угодно ибо нечаянно в потоке могут встретиться эскейпт последовательности которые могут управлять терминалом, и если вы это нечаянно сделали и у вас повис именно терминал то его можно перезапустить командой reset. даже если вводимые символы не печатаются.

вот что отобразилось у меня при выполнении команды в шаге 9:
ul80jt-mdm:tmp mikedm$ cat test.txt
hello


10 — а теперь немного терминального ушу:
echo "hello world" >> test.txt && cat test.txt

— вах вах, это не одна команда а несколько, давайте подробно их разберем, но прежде поглядим, что вывелось у меня.
ul80jt-mdm:tmp mikedm$ echo "hello world" >> test.txt && cat test.txt
hello
hello world



в команде 10 мы видим двойной амперсанд который разделяет две команды:
echo «hello world» >> test.txt = запись строки hello world в файл test.txt
и
cat test.txt = вывод содержимого файла.

двойной амперсанд, сиречь && обозначает логическую команду «если предыдущая команда выполнилась успешно, то есть код завершения был равен нулю, то выполнить следующую команду»
а так же есть его антипод || это логическая команда «если предыдущая команда выполнилась не успешно, то есть код завершения был не равен нулю, то выполнить следующую команду „

Так, что же произошло на 10 шаге — строка “hello world » была добавлена в файл test.txt ибо >> перенаправление с добавлением. и поскольку оно было успешно то будет отображено содержимое файла test.txt


содержимое файла можно посмотреть и в графических приложениях. думаю на этот раз достаточно.
  • Дата: 29-06-2016, 19:17

Предыдущие статьи сайта:

Понравилась статья? Ставь лайки, рассказывай друзьям!



Отзывы о статье: Великий и ужасный Terminal

Технологии, секреты и фишки Apple: Iphone, iPad, iPod