Спасибо всем кто пришёл.
Это "пропущенный семестр" по информатике
по крайней мере,
так мы назвали этот курс.
Если вы здесь не для этого -
вы ошиблись аудиторией.
Мы будем здесь примерно час -
просто чтобы вы ориентировались.
Сперва я хочу рассказать немного о том,
почему мы проводим этот курс.
Этот курс вытекает из наблюдений Аниша,
Хосе и меня, сделанных
во время ассистирования
курсов в MIT, которые
заключаются в следующем:
в основном все мы, специалисты
по информатике, знаем, что
компьютеры прекрасно справляются
с повторяющимися задачами
и автоматизацией,
но мы часто не осознаём
как много инструментов могут улучшить
наши процессы разработки.
Мы можем гораздо эффективнее
использовать наши компьютеры,
потому что мы можем использовать компьютер
как инструмент для нас самих,
а не только для создания веб сайтов
или программного обеспечения.
И этот курс - это попытка это исправить,
это попытка показать вам
некоторые из этих инструментов,
которые вы можете эффективно использовать
в повседневности, исследованиях и учёбе.
И это будет курс где мы хотим научить вас,
как лучше использовать инструменты,
которые вы уже знаете, а также
надеемся показать вам инструменты,
о которых вы раньше не знали,
и как комбинировать эти инструменты
для создания более мощных вещей,
чем вы можете сделать сегодня.
Курс будет состоять из 11 часовых лекций
каждая из которых охватывает одну тему.
Вы можете посмотреть на веб сайте,
который также написан вон там,
темы лекций и даты каждой из них.
Они будут в основном независимыми,
и вы можете появляться только на тех,
которые вам интересны.
Но мы будем считать что вы в курсе всего,
и когда мы дойдём до более поздних лекций,
я не буду например объяснять bash заново.
Мы выложим конспекты и записи лекций.
Когда точно - мы ещё не установили,
но это будет после лекций. Очевидно,
что видео должно быть выложено после.
Курс буду вести я - Джон,
и Аниш - сидящий вон там, и Хосе,
которого сейчас здесь нет,
но он будет читать завтрашнюю лекцию.
И имейте ввиду, что мы пытаемся покрыть
много основ в течении курса из всего лишь
11 часовых лекций.
Поэтому мы будем идти относительно быстро,
но, пожалуйста, останавливайте нас
если чувствуете что не успеваете,
или надо уделить больше времени,
просто скажите нам об этом.
Пожалуйста, прерывайте нас вопросами,
также после каждой лекции нас можно найти
на 9 этаже в 32 корпусе в Stata Center,
корпус информатики.
Если будете на девятом этаже
в gates tower, можете прийти попробовать
некоторые упражнения,
которые мы даём на каждой лекции
или просто задать нам другие вопросы
о вещах которые мы обсуждали на лекции
или о других вещах касательно
использования вашего компьютера
более эффективно.
Из-за ограниченного времени
мы не сможем покрыть все инструменты
во всех деталях,
и поэтому мы попробуем осветить
интересные инструменты
и интересные способы их использования.
Мы не обязательно будем углубляться
в детали о том как всё работает,
или более сложные случаи.
Но если у вас есть вопросы об этом,
пожалуйста задавайте их нам.
Многие из этих инструментов
мы использовали годами,
и мы, может быть, можем указать
на дополнительные интересные вещи,
которые вы можете с ними делать.
Так что пользуйтесь тем, что мы здесь.
Этот курс будет...
Я не хочу сказать, что он будет
слишком быстрым,
но в течении этой лекции
мы покроем много основ,
которые мы будем считать, что вы знаете
в течение всего семестра.
Такие вещи как использовать shell
и терминал, я объясню что это
тем кто не знаком с этим.
И затем мы довольно быстро перейдём
к более продвинутым инструментам
и их использованию.
Вы уже можете видеть из конспектов
как выглядят темы которые мы покроем.
Итак, мы переходим к сегодняшней лекции,
в которой мы рассмотрим shell,
и shell будет одним из основных способов
взаимодействия с вашим компьютером,
как только вы захотите
делать что-то больше,
чем привычные визуальные интерфейсы
позволяют вам делать.
Визуальные интерфейсы в некотором роде
ограничены в том,
что они позволяют вам делать,
потому что вы можете делать
только то для чего есть кнопки,
слайдеры и поля ввода.
Часто все текстовые инструменты
сделаны так, чтобы быть одновременно
совместимыми друг с другом,
и чтобы в то же время иметь
кучу способов комбинировать их
или программировать и автоматизировать их.
И поэтому в этом курсе
мы будем фокусироваться
на этих инструментах командной строки
или на текстовых инструментах.
И shell - это место где вы будете
делать большую часть этой работы.
Поэтому для тех из вас,
кто не знаком с shell -
большинство платформ предоставляют
какой-нибудь shell.
На Windows это часто PowerShell,
но также другие shell доступны на Windows.
На Linux вы найдёте тонны терминалов -
это такие окна,
которые позволяют вам отображать shell,
вы также найдёте много других типов shell.
Наиболее рапространённый -
это bash - или "Born Again SHell".
из-за того что это настольно часто используемый shell -
его мы будем рассматривать в этих лекциях в первую очередь
если вы на Mac OS - у вас тоже есть bash возможно более старой версии
если вы откроете terminal app
вы можете следовать на любой из этих платформ, но учитывайте что в большинстве своём это будет
Linux centric, с точки зрения как мы это преподаём
даже если большинство их этих инструментов работают на всех платформах
если вы хотите установить терминал или shell и вы не знаете как это сделать -
мы будем счастливы вам это показать на кафедре,
или это обычно очень легко нагуглить - ваша платформа плюс как бы терминал и вы найдёте
теперь, когда вы открыли терминал вы увидите что-то что выглядит немного вот так
обычно одна только линия сверху
это как известно "командная строка" ("shell prompt")
вы можете видеть как выглядит моя командная строка - у неё есть моё имя пользователя,
имя моего компьютера, текущий путь в котором я нахожусь
и мы поговорим о путях немного позже
и тогда это реально просто мигает - они приглашают меня что-нибудь ввести
и это и есть командная строка - где вы говорите shell что вы хотите делать
вы можете настроить её как угодно, и когда вы откроете на своём компьютере,
она может выглядеть немного по другому
может выглядеть как-то так если вы настроили её немного
или может выглядеть как угодно
му не будем углубляться в настройки shell на этой лекции, мы сделаем это потом
мы поговорим о том как вы будете использовать shell с пользой
и это ваш основной текстовый интерфейс к вашему компьютеру - через этот shell
в командной строке вы вводите команды и команды могут быть относительно простыми
обычно что-нибудь как запускать программы с аргументами
как это выглядит? Хорошо, мы можем запустить одну программу "дата" - date
мы просто набираем date и жмём enter
и тогда увидите, что неудивительно, дату и время
вы можете также запустить программу с аргументами
это один путь изменить исполнение программы
Так, к примеру, есть программа "эхо" - echo
и она просто выводит заданные вами аргументы
и аргументы это просто разделены пробелами вещи, следующие после имени программы
так, мы можем сказать "привет", и она выведет "привет"
возможно, не так ужасно удивительно, но это самые основы аргументов
одну вещь вы заметили - аргументы разделены пробелами
и вы можете подумать, что если я хочу один аргумент из нескольких слов
вы можете взять их в кавычки
вы можете сделать так echo Hello пробел World
и теперь программа echo получает один аргумент, который содержит строку "Hello World" с пробелом
вы можете использовать одинарные кавычки
и к разнице между одинарными и двойными кавычками мы вернёмся и будем говорить о bash скриптах
вы можете избежать одиночный символ (избежать разбиения строки одиночным символом)
например Hello\ Word - это тоже будет работать
Все эти правила как вам избежать, и как разбирать, и брать в кавычки различные аргументы и переменные
- мы рассмотрим немного позже.
Надеюсь вы не столкнётесь со слишком многими странностями в этой связи,
просто имейте ввиду, хотя бы, что пробелы разделяют строку
так если вы делаете что либо, как - создать директорию "Мои фотографии"
вы не можете просто ввести: сделать директорию Мои фотографии
вы получите две директории - одну с названием "Мои" и другую с названием "фотографии"
и это возможно не то что вы хотите
Теперь, одно вы можете спросить - как shell знает что есть эти программы
когда я ввожу date, или когда я ввожу echo - как оно знает что эти программы должны делать
и ответ на это - то что в вашем компьютере встроены программы, которые идут с компьютером
также как ваш компьютер может идти с приложением терминал, или с Windows Explorer,
или с каким-то браузером, он так же идёт с группой приложений ориентированных на терминал
и они находятся в вашей файловой системе
и ваш shell знает как определить где программа находится
B принципе знает как искать программы
Делается это через так называемую неизменную системную переменную (invariant environment variable)
Системная переменная - это такая же переменная, которую вы возможно использовали в языках программирования
Выходит что shell и "заново рождённый" shell в особенности, есть в действительности язык программирования
Эта командная строка приведённая здесь - может не только запускать программы с аргументами,
вы можете так же делать такие вещи как while циклы, for циклы, условные выражения,
всё это. Вы можете определять функции, вы можете декларировать переменные, и всё это вы можете делать в shell
Мы рассмотрим многое из этого на следующие лекции о shell скриптах
Сейчас же, давайте просто рассмотрим эту конкретную системную переменную
Системные переменные определяются каждый раз вы запускаете свою shell
Вам не нужно определять их каждый раз вы запускаете свою shell
Это такая группа как где ваша домашняя директория, какое ваше имя пользователя,
и так же есть та критичная для этой конкретной цели, которая есть PATH variable
Так, если я эхо $PATH это покажет мне все пути ("paths") на моей машине где shell будет искать программы.
Вы заметите что это список, разделённый двоеточиями,
это может быть долго и тяжело читать,
но суть в том что - когда вы введёте имя программы,
поиск будет идти через список путей на вашем компьютере
и будет искать в каждой директории
программу или файл чьё имя совпадает с командой которую вы пытаетесь исполнить.
Так, в моём случае, когда я пытаюсь запустить data или echo,
оно пройдёт через них один за одним,
до тех пор пока найдёт тот который содержит программу называемую call или echo
и запустит её.
Если вы хотите знать какую оно собственно запускает - существует команда which ("который")
которая позволит нам сделать это
Так я могу ввести which echo и оно мне скажет
"если я хочу запустить программу с именем echo, я буду запускать вот эту вот"
Стоит остановиться здесь чтобы поговорить о том, что есть пути ("paths")
Так пути ("paths") есть способ именовать местонахождение файла на вашем компьютере
В Linux и в Mac OS эти пути ("paths") разделены косой чертой ("forward slashes")
Так здесь вы увидите что это в корневой директории
Так косая черта в самом начале указывает на то что начинается с самого верха файловой системы,
потом смотри в директории под названием usr, потом смотри в директории bin,
и потом ищи файл под названием echo
В Windows такие пути ("paths") обычно разделены обратными косыми чертами ("back slashes").
И где в Linux и в Mac OS все пути ("paths") живут в корневом именном пространстве
так все пути ("paths") начинаются с косой черты (или все абсолютные пути ("absolute paths")),
в Windows есть свой корень для каждого раздела.
Так вы могли видеть такие вещи как С:\ или D:\
Таким образом Windows имеет как бы раздельные иерархии путей файловой системы для каждого имеющегося у вас диска.
Тогда когда Linux и Mac OS все они смонтированы под одним пространством имён.
Вы возможно заметили что я сказал слово абсолютный путь ("absolute path") и вы возможно не знаете что это значит.
Так абсолютные пути - это пути полностью определяющие местонахождение файла
Так в этом случае это говорит... это говорит о специфическом echo файле
и это даёт вам полный путь ("full path") к этому файлу,
но там так же есть вещи известные как относительные пути ("relative paths")
Так относительный путь ("relative path") относителен к тому где вы сейчас находитесь
и так, способ как мы находим где мы находимся -
вы можете ввести pwd текущая рабочая директория ("present working directory")
настоящая?.. "PRINT working directory"
Так если я введу pwd это выведет текущий путь ("path") в котором я нахожусь
Правильно? Так теперь я нахожусь в домашней директории, под root, потом John, под ним и тогда dev, под ним и т.д.
Отсюда я тогда могу изменить мою текущею рабочею директорию
и все относительные пути ("relative paths") относительны текущей рабочей директории
которая в общем-то где вы сейчас находитесь
В этом случае для примера я могу cd /home
cd - означает изменить директорию ("change directory")
это способ которым я меняю то что моя текущая директория есть
в это случае я изменяю на домашнею директорию /home
и теперь я - вы увидите моя командная строка изменится чтобы указать
что я сейчас в домашней директории /home
Это даёт мне только имя последнего сегмента пути ("path"),
но вы можете настроить ваш терминал показывать вам полный путь
где бы вы не были
И теперь, если я введу pwd снова - это покажет мне что я в /home
Существует также пара особенных директорий . и ..
. - означает "текущая директория"
.. - означает "родительская директория"
Это способ позволят вам легко перемещаться по файловой системе
Например здесь, если я ввиду cd ..
это покажет мне что я теперь в /
то есть я в корневой директории файловой системы
я был в /home, а теперь я в /
И действительно, если я введу pwd это подтвердится
И я также могу использовать относительные пути ("relative paths") чтобы перейти вниз по файловой системе
я могу ввести cd ./home и это изменит директорию на home директорию под текущей директорией
Правильно? Это приведёт меня обратно в /home
Если я попробую ввести ./home снова - ответ будет: "такой директории не существует"
Потому что нету home директории в текущей директории где я теперь
куда я попал выполнив cd
Правильно?
И я могу как бы cd всю дорогу назад, в то место где я был
используя относительные пути ("relative paths")
И я также могу делать вещи как .. .. .. чтобы вернутся куда-нибудь глубоко назад в мою файловую систему
это, по случаю, весь путь назад в корневую директорию, так здесь есть директория bin
и под bin есть файл echo, итак я могу сделать world
и это запускает программу echo из директории bin
Хорошо, это способ как вы можете конструировать пути,
чтобы произвольно пересекать вашу файловую систему
Иногда вам нужены абсолютные пути иногда относительные
Обычно вы ипользуете кротчайший
Но, если вы хотите, к примеру, запустить программу,
или написать программу которая запускает программу,
такую как echo или date
и вы хотите запускать откуда угодно
вам или нужно ввести имя программы, как data или echo
и позволить shell использовать этот путь чтобы найти где она находится,
или нужно ввести абсолютный путь ("absolute path")
Потому что если вы дадите относительный путь ("relative path"),
тогда если я запущу её в моей домашней директории,
и вы запустите её в какой-то другой директории,
это может работать у меня, но не у вас
В общем-то, когда мы запускаем программу,
она будет оперировать в текущей директории
по крайней мере по умолчанию
если мы не зададим какие либо аргументы
И это очень удобно - это значит что часто нам не нужно давать полные пути,
мы можем просто использовать имена файлов в директории где мы находимся
Одно что действительно удобно - это найти что находится в текущей директории
Так мы уже видели pwd - который выводит наше текущее местонахождение
Существует команда ls - которая покажет вам список ("list") файлов в текущей директории
Так, если я введу ls здесь - это список всех файлов в текущей директории
Правильно? И удобный способ просто и быстро перемещаться в файловой системе
Вы увидите что если я, как бы, cd .. и потом ls
это покажем мне файлы из той директории
но я так же могу ввести ls .. я как бы могу задать путь
и ls ту директорию заместо этой
Вы можете видеть это если я пойду в саму корневую директорию
Правильно? И корневая директория содержит другие файлы
Есть один удобный трюк, о котором вы возможно не знаете,
две другие особые вещи вы можете сделать
одна это тильда символ ~ этот символ приведёт вас в вашу домашнею директорию
Таким образом, ~ всегда представляет домашнею директорию
И вы можете делать относительные пути ("relative paths") туда
я могу ввести ~/ и я тут - потому что тильда выразилась в /home/jon
Так же, в особенности для cd, очень удобный аргумент вы можете задать - тире
если вы введёте cd - вы перейдёте в директорию где вы были до этого
Так если я введу cd - я попаду назад в корневую директорию
Если я введу cd - снова, я попаду назад в missing-semester
То есть, это удобный способ если вы хотите переключатся между двумя разными директориями
В случае ls, или в случае cd - могут существовать аргументы о которых вы не знаете
Правильно? Пока ещё мы не делали ничего, кроме, задания пути,
но откуда бы вы узнали что можете задавать путь в ls?
Ну, большинство программ принимают то что известно как аргументы, вроде флагов и опций
они обычно начинаются с тире -
Одна из наиболее удобных из них - это --help
Большинство программ это поддерживают,
и если вы введёте к примеру ls --help это надеюсь выведет кучу информации об этой команде
И вы увидите тут как использовать ls, различные опции
и вы можете задать количество файлов
Как читать эти описания? - троеточие означает один, ноль или больше
Квадратные скобки означают - необязательно - то есть в этом случае опции не обязательны
и количество файлов необязательно (опционно)
И вы увидите что это говорит о том что программа делает
и также определяет разные типы флагов и опций, которые вы можете задавать
Обычно мы называем одиночное тире с одиночной буквой флагом,
или что-то что не принимает значения - флагом.
И все что принимает значение - опцией
Так, к примеру, -a и --all оба флаги,
а -с и --color - опции
Одну вещь вы увидите здесь, если покрутите достаточно долго вниз,
-l флаг
и упс, это не помогает
-l флаг использует длинный формат вывода
это уже само по себе достаточно полезно, но давайте посмотрим что это на самом деле делает
если я введу ls -l это всё так же выводит файлы из текущей директории,
но и даст мне гораздо больше информации об этих файлах
и это то, что вы будете использовать довольно часто,
потому что, эта дополнительная информация, часто, довольно удобна
давайте посмотрим что представляет некоторая из этой дополнительной информации
ага, начнём с того, что d в начале некоторых из этих строк,
означает что это что-то является директорией
так _data здесь, к примеру, является директорией
а 404.html не является директорией, это файл
следующие буквы после этого показывают права доступа к тому файлу
Так, как вы уже видели раньше я могу не иметь доступа открыть данный файл,
или я могу не иметь доступа перейти в данную директорию
и это всё продиктовано правами доступа к данному файлу или директории
Способ прочтения этого - первая группа из трёх прав доступа установленна для владельца ("owner") файла
Все эти файлы которые вы здесь видите принадлежат мне
Вторая группа их трёх символов - права доступа для группы владеющей этими файлами
В этом случае все эти файлы также принадлежать группе Джона
И последняя группа их трёх - права доступа для всех остальных
то-есть всех кроме пользователя или группы владеющей этим файлом
Эта директория возможно немного скучная,
потому что всё принадлежит мне
Но если мы сделаем что-нибудь вроде cd / и ls -l
вы увидите что всё принадлежит root ("суперпользователь")
мы вернёмся кто му что такое root пользователь
Но здесь вы видите некоторые права доступа к файла немного более интересные
Группы из трёх представляют из себя права считывает, изменять и запускать
Что это означает отличается для файлов и директорий
Для файлов это довольно просто
если у вас есть право считывать файл - вы можете считать содержимое файла
если у вас есть право изменять файл - вы можете добавить к этому файлу
или полностью заменить его
И если у вас установлен запустить, X бит, у файла,
тогда вы можете запустить этот файл на выполнение
Так, если мы введём ls -l /bin,
это ужасно,
и /usr/bin - вы увидите
что у них у всех бит "запустить" выставлен
даже для людей которые не владеют этим файлом
И это потому что программа echo, на пример,
мы хотим что бы все на этом компьютере могли её запустить
Нет причин чтобы сказать "только некоторые пользователи могут запускать echo"
Это не имеет никакого смысла
Для директорий, однако, эти права доступа немного отличаются
Так, "считывать" означает - имеете ли вы право видеть
какие файлы находятся внутри этой директории
то есть, думайте о считывании списка, для директории
имеете ли вы право листать её содержимое
изменять - для директории, это имеете ли вы право переименовывать,
создавать или удалять файлы в этой директории
то есть, это всё ещё как бы "изменять", но заметьте что это означает что
если вы имеете право "изменять" файл, но не имеете права "изменять" директорию,
вы не можете удалить этот файл.
Вы можете сделать его пустым, но вы не можете удалить его
потому что, это бы потребовало "изменить" саму директорию
и в заключении, "запустить" на директориях, часто сбивает людей с толку
"запустить" на директориях - это то, что известно как "поиск"
и это не особо полезно как имя, но что это значит, имеете ли вы право
войти в эту директорию
Если вы хотите получить доступ к файлу, если вы хотите открыть его, или считать его,
изменить его, всё что вы хотите сделать, в общем, cd - перейти в это директорию
вы должны иметь права "запустить" и на всех родительских директориях этой директории,
и на самой этой директории
Так, например, для меня, получить доступ к файлу внутри /user/bin
как /user/bin/echo - я должен иметь право "запустить" на корневой директории root,
я должен иметь право "запустить" на user,
и я должен иметь право "запустить" на bin
если я не имею всех тех "запустить" битов - я не буду иметь права доступа к тому файлу,
поскольку у меня не будет права войти в директории по пути
есть несколько битов, которые вы можете встретить эссы или тии, вы можете видеть эллы
их мы можем обсудить на кафедре если вам интересно
они в основном, не будут относится к тому что вы делаете в этом классе,
но о них хорошо бы знать, так, если вам интересно, поищите об них сами
или спросите у нас на кафедре
Существуют некоторые другие программы о которых хорошо бы знать
о, простите, ещё одну вещь я должен упомянуть: если у вас просто тире - у вас нет этого права доступа
так, если это, к примеру: r-x - это означает у вас есть права "считывать" и "запускать",
но у вас нет права "изменять"
Существуют некоторые полезные программы, чтобы познакомится с ними сейчас,
одна из них команда move, или mv
Так если я cd назад, в мой missing-semester, тут mv позволяет мне переименовать файл
и переименовать здесь берёт два пути - берёт старый путь и новый путь
Это означает, что move, позволяет вам как переименовывать файлы,
если вы измените имя файла, но не директорию,
или позволяет вам переместить файл в совершенно другую директорию
это просто, вы задаёте путь к текущему файлу, и путь куда вы хотите тот файл поместить
И это может поменять его местоположение и его имя
Так, например, я могу mv файл dotfiles.md стать foo.mv
Бесполезно. Правильно?
И также, я могу mv его обратно
Так же существует команда cp или copy, очень похоже - вы копируете файл
cp также принимает два аргумента.
Оно берёт путь откуда вы хотите копировать,
и путь куда вы хотите копировать
И это полные пути ("full paths")
Так я могу использовать это, например,
чтобы сказать: "я хочу скопировать файл dotfiles.md в, конечно, ../food.md"
и теперь, если я сделаю ls .. , то я увижу там есть файл food.md
в той директории
Так, cp тоже принимает два пути, не обязательно находится в той же директории
и также, там есть команда rm, которая позволяет удалить файл
и там также вы можете задать путь, в этом случае я удаляю ../food.md
вы должны быть в курсе что для удаления, особенно в Lunix, удаление по умолчанию не рекурсивно
Там, вы не можете удалить директорию используя rm
Вы можете послать флаг -r , который позволит вам произвести рекурсивное удаление,
и задать путь который вы хотите удалить, и это удалит всё под ним
Существует, также, команда rmdir , которая позволяет вам удалять директорию,
но она только позволяет вам удалить эту директорию, если она пустая
Таким образом, идея здесь как бы безопасного механизма для вас,
так что вы случайно не выбросите кучу своих файлов
И последняя маленькая команда, которую удобно использовать,
это mkdir - которая создаёт новую директорию
И как мы говорили до этого, вы не хотите сделать что-то вроде этого,
потому что, это создаст две директории для вас,
одна будет называться "my" а другая "photos"
Если вы действительно хотите создать такую директорию,
вы либо избежите пробел, или возьмёте строку в кавычки
Если вы когда либо захотите больше информации о том,
как любая команда, в принципе, работает на этих платформах
существует действительно удобная команда для этого тоже
Существует команда называемая man (manual pages - руководство, мануал)
Эта программа берёт как аргумент название другой программы,
и выдаёт её "руководство к эксплуатации"
Так, на пример, мы можем ввести man ls
и это показывает нам мануал к ls
Вы заметите что в случае ls - это довольно похоже на то что мы получили с ls --help
но здесь немного удобнее ориентироваться, немного удобнее читать
Обычно ближе к концу вы найдёте примеры, информацию о том кто это написал,
и где вы можете найти больше информации, и типа такого
Одна вещь может запутать, иногда, по крайней мере до последней версии,
где они добавили это дерево внизу, которое говорит "нажми q чтобы выйти"
Раньше они не упоминали этого: вы нажимаете на q чтобы выйти из этой программы
Может быть очень сложно выйти, если вы не знаете этого
Удобный шорткат здесь - ctrl l
который позволяет вам очистить терминал и перейти на верх
Так мы только говорили о программах изолированно,
но основная мощность shell проявляется
когда вы начинаете комбинировать различные программы
Правильно?
Так вместо выполнения cd , выполнения ls , и т.д. ,
вы возможно хотите объединить несколько программ вместе,
вы возможно хотите взаимодействовать с файлами,
и оперировать файлами между программами
И способ как мы можем это сделать:
использовать нотацию потока, которую даёт нам shell
Каждая программа, по умолчанию, имеет,
я немного упрощу, и скажу: два первичных потока
Она имеет поток ввода, и поток вывода
По умолчанию, поток ввода - это ваша клавиатура
В общем-то поток ввода это ваш терминал,
и то что вы печатаете на терминале,
окажется к конце концов в программе
И она так же имеет поток вывода по умолчанию, который, что либо программа выводит,
будет выведено в этот поток
И по умолчанию, это тоже ваш терминал
Поэтому, когда я ввожу echo hello, это выводится назад на мой терминал
Но shell даёт вам способ переназначить эти потоки
Поменять, куда ввод и вывод программы указывают
Этот способ, наиболее простой способ: использование знаков угловых скобок
так что вы можете ввести что-нибудь как это,
или вы можете ввести что-нибудь как это
Левая угловая скобка указывает переназначить ввод этой программы на содержимое этого файла
И закрывающая угловая скобка означает переназначить вывод предыдущей программы в этот файл
Так, давайте посмотрим на пример того, как это будет выглядеть
если я введу echo hallo , я могу сказать, я хочу сохранить тот контент
в файле с именем hello.txt
И потому что я задал, это относительный путь ("relative path"), правильно?,
это создаст файл в текущей директории, с названием hello.txt
и по крайней мере в теории, его содержимое должно быть словом "hello"
Так, если я запущу это, заметьте что ничего не выведено на мой экран
В предыдущий раз когда я выполнял echo hello это вывело hello
Теперь это hello ушло в файл под названием hello.txt
и я могу проверит это используя программу называемую cat
Так, cat выводит содержимое файла
Так, я могу ввести cat hello.txt, и вот он показывает мне hello
Но cat также поддерживает этот тип переназначений
Так я могу сказать cat, который по умолчанию только выводит свой ввод,
просто дублирует что введено на выводе,
я могу сказать: я хочу что бы ты взял свой ввод, из hello.txt
Что случится в этом случае, это shell откроет hello.txt
возьмёт его содержимое и сделает его вводом cat,
и тогда cat просто выведет это в свой вывод,
который, поскольку я его не переназначил, будет просто моим терминалом
То есть это просто выведет hello на экран
И я могу использовать их обоих одновременно
Так, например, если я хочу скопировать какой-нибудь файл,
и я не хочу использовать cp команду по какой-то причине,
я могу сделать это:
и в этом случае, я ничего не говорю программе cat, я просто говорю "далай свою нормальное дело"
правильно, программа cat ничего не знает об этом переназначении
Но я говорю shell использовать hello.txt как ввод для cat,
и записывать всё что cat выводит в hello.txt
Опять это ничего не выводит на экран
Но если я cat hello.txt - я получу вывод, как и следовало ожидать,
что есть копия оригинального файла
Существуют так же двойные закрывающие скобки, что добавляет, вместо просто перезаписывания
Так, вы заметите, если я сделаю cat hello.txt в hello2.txt опять
и тогда я cat hello2.txt - он всё ещё содержит hello,
несмотря на то что это уже содержало hello
Если я переключу это, взамен, на двойные закрывающие скобки,
что означает добавить
И если я теперь cat этот файл - в нём hello повторяется дважды
Это довольно простые,
они просто способы взаимодействия с файлами,
но когда это становится действительно интересно - это дополнительный оператор
который вам даёт shell, называется pipe ("труба") символ
Так | - вертикальная черта, и pipe значит: -
"возьми вывод программы с лева и сделай это вводом программы справа"
Правильно?
Так, как это выглядит, хорошо, давайте возьмём примет ls /
или ls -l /
это выводит кучу вещей. Давайте скажем я хочу только последнюю линию этого вывода
Хорошо, существует команда под названием tail ("хвост")
И tail выводит строки с конца своего ввода
И я могу ввести -n1 - так это флаг n
вы так же можете использовать --lines, если хотите использовать её как более длинную опцию
но в этом случае, это тоже самое как вывод последней линии
и я могу связать это вместе - так я могу сказать ls -l / | tail -n1
и заметьте что здесь ls не знает об tail, и tail не знает об ls
это разные программы и никогда не были запрограммированы быть совместимыми друг с другом
всё что они умеют делать - это читать из ввода и выводить в вывод
а pipe, как раз, связывает их вместе
И в этом конкретном случае, я говорю: "я хочу вывод из ls быть вводом в tail,
и я хочу вывод от tail просто на мой терминал" потому что я не перенаправил его
Я мог бы так же перенаправить это, ну скажем, я хочу этот вывод в ls.txt
и в этом случае если я cat ls.txt, я получу соответствующий вывод
И оказывается, вы можете делать реально чёткие вещи с этим
мы покроем это гораздо больше на лекции по обработке данных ("data wrangling")
это будет через 4 дня, или около того
о разных интересных вещах которые вы можете делать, кода начнёте
строить более продвинутые конвейеры ("pipelies")
один, дать вам один пример, мы можем сделать что-то вроде curl --head silent google com
так, чтобы просто показать вам как это выглядит
это даёт мне все HTTP заголовки для доступа к google.com
и я могу послать это в grep --ignore case, или просто -i, если хочу, content-length
так это выведет мне заголовок content-length ("длинна содержимого")
grep это программа о которой мы поговорим позже
она позволит вам искать во вводе по заданному ключевому слову
мы можем пропустить это через, скажем, команду cut
которая принимает дилимитер - выставленный как пробел,
и я хочу второе поле
и это выводит только content-length ("длинна содержимого")
это, как бы глупый пример, правда, он просто позволяет вам вытащить длину содержимого
в байтах, с google.com, из командной строки
это не очень полезная вещь, но вы можете видеть как сцепляя это, вы можете
достигнуть кучу действительно интересных эффектов от манипуляций с текстом
И оказывается, что pipes не только для текстовых данных,
вы можете делать это так же с изображениями,
у вас может быть программа,
которая манипулирует с бинарным изображением на входе и выводит бинарное изображение
и вы можете сцепить их вместе таким образом
И позже мы поговорим о некоторых такого рода примерах тоже
вы можете это делать даже для видео - если хотите.
Вы можете транслировать, это, например, прекрасный способ
если у вас дома есть Chromecast, вы так можете транслировать видео файл,
если поставить последней программой в ваш pipe программу отправки Chromecast
Так, вы транслируете в неё видео файл и она транслирует,
или HTTP на ваш Chromecast
Мы будем много говорить об этом на лекции по обработке данных ("data wrangling"), но
есть ещё одна вещь, о которой я хочу рассказать вам как бы:
как использовать терминал более интересным и более мощным способом,
чем тот к которому вы могли привыкнуть.
Возможно даже будет интересным для тех из вас, кто уже чувствует себя с терминалом комфортно.
Но, сперва нам нужно покрыть важную тему относящеюся к Linux системам, и Mac OS
системам в особенности, это понятие root пользователя
root пользователь это что то вроде администратора в Windows
и имеет нулевой идентификационный номер
root пользователь особенный, потому что ему позволено делать на вашей систему всё что он захочет
даже если файл закрытые для всех для считывания,
или если закрыт для всех для изменений,
root всё равно имеет доступ к этому файлу
root это как бы супер юзер - они могут делать всё что захотят
и чаще всего вы на будете оперировать как супер юзер
вы не будете root, вы будете пользователем как Джон, или какое угодно ваше имя
и это будет пользователь которым вы действуете
Потому что, если бы оперировали своим компьютером как пользователь root всё время -
если вы запустите не ту программу, она может разрушить ващ компьютер
И вы не хотите этого! Правильно?
Но время от времени вы хотите сделать что либо, что требует, что бы вы были root
Обычно, в таки случаях,
вы будете пользоваться программой под названием sudo,
или делать как su - и su в этом случае "супер юзер"
Так, это способ выполнить следующее как супер юзер
Обычно, как sudo работает: вы вводите sudo и затем команду как обычно на вашем терминале,
и он выполнит вашу команду так, как если бы вы были root, а не ваш пользователь
Где вам может это понадобится?
Хорошо, на вашем компьютере существует много файловых систем,
но в особенности есть одна под названием sys fs
Если вы cd в /sys - это целый новый мир:
эта файловая система не файлы на вашем компьютере,
а различные параметры ядра ("kernel")
Так, ядро ("kernel") - это в общем-то, ядро вашего компьютера
Это ваш способ получить доступ к различным параметрам ядра,
через что-то, что выглядит как файловая система
Вы здесь увидите, что если я cd в class, на пример,
это имеет директории для различных типов устройств
с которыми я могу взаимодействовать,
или различные ключи к которым я могу получить доступ
или всякого рода странные рычажки, внутри
И поскольку они представлены как файлы - это означает что мы можем использовать
все те инструменты, которые мы пока использовали, чтобы манипулировать ими
Один такой пример, если вы пойдёте в /sys/class/backlight
так, это backlight директория позволяет вам конфигурировать подсветку на вашем лаптопе,
если она у вас есть
Так, я могу cd в intel_baklight, это intel лаптоп,
здесь внутри вы увидите файл под названием brightness ("яркость")
Я могу cat brightness - это текущая яркость моего экрана
Но не только это, я могу это также изменить,
чтобы изменить яркость моего экрана
Так, вы можете подумать что я могу,
давайте посмотрим какая здесь максимальная яркость
ОК, так это сейчас выставлено на максимум
Вы можете представить, что я могу сделать что-то вроде
Если я введу echo, сделаем половину или около того, echo 500 > brightness
Если я введу - это говорит - "в доступе отказано"
Я не имею права менять яркость, потому что, для того, чтобы,
в общем для того чтобы поменять что-то в ядре,
вам нужно быть администратором
И вы можете представить, что способ это разрешить, это ввести sudo echo 500
Но я опять получил ошибку - "в доступе отказано"
Но почему?
Это потому что, как я уже упоминал ранее, эти перенаправления ввода и вывода -
не есть что то - о чём знают программы
когда мы перенаправили ls в tail, tail не знала о ls, и ls не знал о tail
pipe и перенаправление было задано shell
Так, в этом случае, что происходит,
я говорю моей shell выполнить программу sudo
с аргументами echo и 500, и пошли вывод в файл под названием brightness
Но shell открывает файл brightness, а не sudo
Так, в этом случае, shell, которая запущена как я,
пытается открыть файл brightness на запись,
и она не имеет права этого делать
И поэтому я получил ошибку "в доступе отказано"
Вы могли видеть это, если вы, как бы, ищите что либо,
вышли на Stack Overflow
и там сказано: просто запусти эту команду
и вы увидите что это далаем что-то вроде:
они дали вам инструкции вроде:
1 > /sys/net/ipv4_forward - например
это что то вы могли видеть, если вы устанавливаете firewall
И эта команда должна работать,
потому что этот маленький символ фунта ("phond symbol"),
указывает - запускать это как root
Это что-то, что очень редко разъяснено,
но это то, что # означает
Вы увидите на моей командной строке знак доллара,
и доллар указывает: вы сейчас не root
Так, вопрос - как мне обойти это?
Я могу переключиться в терминал root.
Так один способ сделает это: запустить sudo su.
sudo su - говорит: "запусти следующею команду как root"
и su - это сложная команда,
которая фактически даёт вам shell как супер юзер
Так, если я введу это, введу пароль, тогда вы сразу увидите
что имя пользователя в начале изменился с jon на root
И командная строка изменилась с $ на #
Если я теперь войду в этот файл, если я введу echo 500 > brightness
мой экран стал немного темнее, но вы не можете это видеть
просто поверье мне
И теперь, я не получил ошибки -
это потому что shell теперь запущена как root
а не как Jon
И пользователь root имеет право открыть этот файл
Но, учитывая наши знания которые мы теперь имеем о терминале
для нас существует способ делать это не прибегая к root shell
И это выглядит следующим образом:
это, я думаю, восстановит 1060
Так, вы видите отличия?
Здесь я говорю моей shell запустить команду echo 1060
которая выполнит echo 1060
И я говорю ей запустить команду sudo tee brightness
И я говору "послать вывод от echo в sudo tee"
Чтобы это понять, вам нужно знать что делает команда tee
Команда tee принимает ввод и пишет его в файл,
но также в стандартный вывод
Так tee это удобный способ если у вас есть,
скажем, журнал, в который вы хотите сохранить,
но вы так же хотите видеть это
Тогда вы можете pipe это через tee, дать ему имя файла,
и это запишет ввод в файл и на ваш экран
И здесь я пользуюсь этой программой:
я говорю: "запусти tee как root и пусть tee пишет в файл brightness"
И так в этом случае программа tee,
которая открывает файл brightness,
запущена как root и имеет право это делать
Если я запущу это сейчас, вы снова не можете видеть,
но яркость включилась на лаптопе
И я не получил никаких ошибок,
и мне не понадобилось переходить в root shell
и запускать команды оттуда
Что часто может быть в некотором роде опасным
Если вы хотите исследовать эту файловую систему немного больше
здесь есть много чего интересного
Если вы просто начнёте осматриваться вокруг,
вы можете найти забавные вещи всех сортов
Так, к примеру, мы заметили что есть забавная команда brightness
Мне интересно, какие ещё яркости я могу задать
Так я могу использовать команду find,
которую мы также обсудим на следующей лекции,
Я буду искать каждый файл, чьё имя немного похоже на brightness
в текущей директории
Это бесполезно
Может быть они не файлы. Я ошибся в слове brightness?
Да, почему это так себя ведёт?
О, по-видимому не хочет найти мне brightness. Как хорошо.
К счастью для вас - я уже знаю одну, кстати.
Существует субдиректория под названием leds, и leds тоже имеет brightness
Какого рода leds здесь есть? У-уу - много всего!
Например яркость scroll lock индикатора
В наше время большинство из вас наверное уже не знает что такое светодиодный индикатор scroll lock,
и ещё менее вероятно что такое сам scroll lock
Вы могли видеть кнопку на своей клавиатуре с надписью "Scroll Lock"
На самом деле никто больше не знает что это значит,
никто в действительности ни для чего её не использует,
это в основном "мёртвая" кнопка, и "мёртвый" индикатор
Что если бы вы захотели настроить его
так, что каждый раз когда вы получаете е-мейл
ваш scroll lock загорается?
Потому что нет другой причины чтобы он загорался
Хорошо, если мы посадим вас в эту конкретную директорию,
в которой есть место для яркости
и оно выставлено в ноль,
что будет если я впишу сюда единицу
Возможно вам не нужно писать случайные числа в случайные файлы
в этой директории, потому что вы влияете на директорию ядра,
как бы, поищите что эти файлы делают.
В этом конкретном случае, я ношу защитные очки - я поискал сам перед этим
Так вы не можете сейчас сказать, но на моей клавиатуре индикатор scroll lock теперь светится
Так, если сейчас я напишу программу которая как бы проверяла е-мейл и всё такое,
я бы мог в конце концов выполнять программу
которая бы эхо в этот файл
и теперь у меня есть способ для моего светодиодного индикатора на моей клавиатуре
показывать когда я получил новый е-мейл
На этом месте вы должны знать примерно как обращаться с терминалом и shell,
и знать достаточно, чтобы выполнять эти простые задания
По крайней мере, теоретически,
вам не обязательно больше использовать указать-и-щёлкать интерфейс
чтобы искать файлы
Ещё один оставшийся трюк, который вам может понадобится -
это возможность открыть файл
до сих пор я только давал вам способы найти файл,
но одна вещь о которой вы должны знать: xdg-open
это возможно работает только на Linux,
на Mac OS я думаю это называется просто open
на Windows - кто его знает?
xdg-open вы даёте имя файла - и он открывается в соответствующей программе
так если вы откроете, если вы введёте xdg-open и HTML файл
который откроет ваш браузер и откроет этот файл
И когда у вас будет эта программа,
в теории - вам не никогда не нужно больше открывать какое-то поисковое окно
вы можете по другим причинам,
но в теории вы можете со всем справиться
используя инструменты с которыми мы сегодня познакомились
Это всё может выглядеть относительно просто для некоторых из вас,
но как я уже упомянул это как бы ознакомительный период
Теперь мы все знаем как работает shell
и многое из того что мы будем делать на будущих лекциях -
это использовать эти знания для действительно интересных вещей
используя shell
вроде изучения интерфейса - интерфейса который мы будем использовать,
поэтому важно чтобы мы все это знали
Мы будем много говорить на следующей лекции
о том как автоматизировать такие задачи
Как писать скрипты которые выполняют для вас несколько программ
И как делать вещи как условные выражения и циклы и прочее, в вашем терминале
И делать такие вещи как выполнять программу пока не вывалится
Что может пригодится в классах где вы хотите выполнять что-либо пока
ваш набор тестов не запорится, к примеру
Так это тема лекции следующей недели, у вас есть вопрос?
(aудитория) Да, просто в связи с тем что вы демонстрировали - это вспомогательная директория
которая предположительно будет работать только если вы выполняете это в Linux, а не в субсистеме Linux ?
Это хороший вопрос! Я не знаю если субсистема Windows для Linix
предоставит файловую систему sis.
Если да - то возможно только в очень малом количестве.
Оно может. Потому что... Я не знаю, проверьте
Одно вы увидите - конспекты этой лекции уже онлайн,
и в самом низу файла - куча упражнений.
Некоторые из них относительно просты,
некоторые из них немного сложнее
И что мы рекомендуем вам сделать, это выполнить их,
если вы уже это знаете, это пойдёт довольно быстро,
если нет - это может научить вам много чему
что вы не знали что не знали
И на кафедре, сразу после этой лекции,
мы будем счастливы
провести вас через всех них,
или другие команды о которых вы узнаете в процессе
и захотите узнать как использовать их более эффективно
И тогда на следующей лекции,
которая будет завтра,
мы просто будем считать что
вы знаете вещи вроде тех которым вас научат упражнения
На сайте есть так же е-мейл адрес,
куда вы можете послать нам вопросы
Если вы подумаете об чём-то поздно ночью
Есть ли вопросы перед там как мы закончим сегодня? Нет? Нет?
Отлично, мы будем на кафедре на девятом этаже здания "ворота" ("gates") здания 32
примерно через 5 минут
Увижу вас там