-
Спасибо всем кто пришёл.
-
Это "пропущенный семестр" по информатике
-
по крайней мере,
-
так мы назвали этот курс.
-
Если вы здесь не для этого -
-
вы ошиблись аудиторией.
-
Мы будем здесь примерно час -
-
просто чтобы вы ориентировались.
-
Сперва я хочу рассказать немного о том,
-
почему мы проводим этот курс.
-
Этот курс вытекает из наблюдений Аниша,
-
Хосе и меня, сделанных
-
во время ассистирования
-
курсов в 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 минут
-
Увижу вас там