Перейти к содержимому

Чем отличаются командные строки в linux macos и windows

  • автор:

чем отличаются командные строки в linux macos и windows

Различия между терминалом Mac и командной строкой Windows с точки зрения возможностей команд?

Как новичок в изучении использования Mac Terminal, который выполняет команды UNIX, есть различия с командной строкой Windows, которая основана на системных командах MS-DOS.

Каковы основные различия между командами, поддерживаемыми в каждой системе, с точки зрения доступа к возможностям ОС и для интенсивного повседневного использования?

Кроме того, какая командная строка лучше всего подходит для работы разработчиков и программистов?

1 ответ 1

Оба пытаются решить одни и те же проблемы.

Основным отличием оболочек CMD и * nix является экосистема, в которой они выросли. CMD/BAT родом из MS-DOS, в то время как csh, ksh, bash и т.д. Все начинали с определенной разновидности unix/linux.

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

В последние годы Microsoft вложила значительные средства в PowerShell (еще один интерфейс командной строки, который поставляется со всеми текущими версиями Windows), и теперь она достаточно развита и имеет гораздо больше функций, чем CMD/BAT.

Это действительно сводится к тому, что у вас есть доступ и вам удобно использовать на данной платформе. Вы даже можете запустить bash в Windows 10 сейчас!

Разница между текстовым режимом Linux и командной строкой Windows

5 ответов

Оба они основаны на одной идее и называются интерфейсами командной строки (см. Википедию). Они работают с одними и теми же принципалами, просто используя разные ключевые слова для выполнения одинаковых команд. Однако следует отметить, что команды, хотя и имеют схожие названия, могут не выполнять ту же самую функцию. Это просто абстракции функций нижнего уровня операционной системы. Подобно тому, как люди могут объяснять похожие идеи, используя разные слова и фразы, то же самое применимо и в этой ситуации. Для справки вот список команд Bash: http://ss64.com/bash/ и тот же веб-сайт. есть команды Windows.

Возможно, вы захотите начать здесь со своего чтения.

Разница в операционной системе. Командная строка (cmd) и эмулятор терминала (оболочка linux bash или аналогичный) представляют собой текстовые интерфейсы для операционной системы. Они позволяют управлять файловой системой и запускать программы без графического интерфейса.

Хотя внешне они в чем-то похожи, эти два интерфейса командной строки имеют разное происхождение:

Командная строка Windows в значительной степени основана на командной строке MS-DOS / PC-DOS, которая, в свою очередь, была основана на командном процессоре консоли CP / M. Интерфейс CP / M CCP сам был основан на более ранней операционной системе под названием RSTS.

Оболочки Linux восходят к исходной оболочке Томпсона UNIX; оболочка Томпсона заимствована из оболочки Multics (откуда возник термин « оболочка »).

Как командная строка Mac сравнивается с Linux?

Знание того, что Mac построен на Unix, заставляет задуматься, а не сладкое ли это место между ними. Но мне интересно: насколько похожа командная строка Mac на bash Linux? Могу ли я разобраться с использованием сценариев vim, bash, git и т.д.? Будут ли общие команды, такие как изменение каталогов, другими? Кто-нибудь знает онлайн ресурс «сравни и сравнивай»?

6 ответов 6

Это очень похоже, но если вы знаете о каких-либо различиях между BSD и Linux, ожидайте, что Mac будет работать с BSD.

bash сам по себе является небольшим подмножеством «командной строки». Чтобы быть полезным, вы обычно используете некоторые другие распространенные утилиты UNIX, такие как awk, или ls, или cut. Из-за своей истории (она произошла от BSD, а не от Linux или SystemV), версии утилит для Mac будут отличаться от тех, которые вы привыкли использовать в Linux (также как версии GNU). Они будут иметь по крайней мере некоторые различия флагов, а также некоторые отличия вывода и функциональности по сравнению с Linux Сценарии, которые их используют, должны быть изменены для компенсации. BSD awk против GNU gawk довольно сильно отличается. ИЛИ вы можете получить эти версии GNU из macports и установить свой PATH так, чтобы это были значения по умолчанию (по сравнению со встроенными версиями).

MacOS X также имеет несколько новых интересных инструментов. open это хорошо, он откроет объект, как если бы вы дважды щелкнули по нему. defaults позволяют вам установить некоторые настройки, некоторые даже не на панелях настроек GUI. textutil может быть полезен, а say может быть веселым.

Что такое командная строка? Как ее запустить на Windows, Linux и Mac?

myphoto

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

2019 12 15 09 00 03 5df5a1c458919

Между тем, были времена, когда компьютером управляли только с помощью клавиатуры, набирая текстовые команды на экране монитора.

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

Например, установка некоторых системных утилит, внесение настроек в операционную систему, настройка веб-серверов и.т.д. просто не возможна без командной строки.

Командная строка (консоль или Терминал) – это специальная программа, которая позволяет управлять компьютером путем ввода текстовых команд с клавиатуры.

Мои уроки по работе с командной строкой здесь.

Командная строка есть во всех операционных системах, будь то Windows, Linux, Mac OS и др.

Давайте посмотрим, как можно запустить ее различных операционных системах.

Windows

Есть несколько вариантов, как это можно сделать.

2019 12 15 08 57 44 5df5a14803e9e

Нажмите сочетание клавиш «Win + R» и наберите команду cmd.

1576066835267 5df0df1593534

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

1576066835495 5df0df1792c95

Mac OS.

На компьютерах операционной системы Apple вызов командной строки выполняется с помощью системной утилиты Terminal.

1576066834234 5df0df1369806

Найти ее можно в списке установленных программ.

Linux.

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

Мои уроки по работе с командной строкой здесь.

Чтобы оставить сообщение, зарегистрируйтесь/войдите на сайт через:

Или зарегистрируйтесь через социальные сети:

Как командная строка Mac сравнивается с Linux?

Это очень похоже, но если вы знаете о каких-либо различиях между BSD и Linux, ожидайте, что Mac будет работать с BSD.

bash сам по себе является небольшим подмножеством «командной строки». Чтобы быть полезным, вы обычно используете другие распространенные утилиты UNIX, такие как awk, ls или cut. Из-за своей истории (она произошла от BSD, а не от Linux или SystemV), версии утилит для Mac будут отличаться от тех, которые вы привыкли использовать в Linux (также как версии GNU). Они будут иметь по крайней мере некоторые различия флагов, а также некоторые отличия вывода и функциональности по сравнению с Linux. Сценарии, которые их используют, должны быть изменены для компенсации. BSD awk против GNU gawk довольно сильно отличается. ИЛИ, вы можете получить эти версии GNU из macports или home brew и установить свой PATH так, чтобы это были значения по умолчанию (по сравнению со встроенными версиями).

MacOS X также имеет несколько новых интересных инструментов. open хорошо, он откроет объект, как если бы вы дважды щелкнули по нему. defaults позволяет вам установить некоторые настройки, некоторые даже не в панелях настроек GUI. textutil может быть полезным и say может быть весело.

Функциональность командной строки в Mac и Linux действительно схожи, поскольку OS X имеет вид UNIX (называемый Darwin) под GUI, который вы видите.

Оболочкой по умолчанию в OS X является bash, поэтому, если вы с ней знакомы, вы все настроите правильно.

На Mac приложением командной строки по умолчанию является Терминал. Существует также ряд других эмуляторов, но в целом Terminal обеспечивает очень похожий внешний вид на оболочку, к которой вы привыкли в Linux.

Основным источником различий являются:

Тем не менее, есть также много классных хаков, доступных из командной строки в OS X (например, open commnand). Есть много предыдущих тем и сообщений в блоге там с дополнительной информацией.

Name already in use

pasta / soft / cli.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Как начать пользоваться командной строкой

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

Для начала, надо знать что командная строка реализована немного по-разному в разных ОС: в линуксе и маке один вариант, в windows другой. На андроиде и iOS тоже есть линуксоподобная командная строка, но чтобы в нее попасть, тебе надо установить какую-нибудь программу-терминал.

Краткий мануал чайника по командной строке:

Как попасть в командную строку?

  • Windows XP: Пуск — Выполнить — набрать cmd — нажать [enter]
  • Windows7: Пуск — набрать cmd — нажать [enter]
  • MacOS: Запустить приложение Терминал (его можно найти поиском в той штуке которая справа вверху экрана)
  • Ubuntu: Запустить приложение Терминал или нажать Alt + Ctrl + F1 (вернуться назад в графический режим — Alt + Ctrl + F7)
  • Другие дистрибутивы Linux: если ты линуксоид, ты и так знаешь

Клавиши, работающие во всех операционных системах

↑,↓ — стрелки вверх и вниз в командной строке позволяют смотреть предыдущие введенные команды, чтобы 2 раза не набирать. В Windows при закрытии окошка консоли вся история теряется, в других ОС — сохраняется.

[tab] — автодополняет имена файлов и команды. Если в текущем каталоге есть файл file.txt, ты наберешь fi и нажмешь [tab] то он автодополнит имя файла (или предложит варианты, если таких файлов несколько).

[ctrl+c] — прерывает выполнение команды, например, если она долго тупит

Важно: клавиша Esc, как и многие привычные клавиши, не работает в командной строке. Клавиши Ctrl + C, V, X обычно не работают как «копировать/вырезать/вставить» (иногда для вставки можно использовать Shift + Ins). Клавиша Ctrl + Q не работает как «выход».

Особенности линукса и мака

В линуксе и маке, [ctrl+l] очищает экран, [ctrl+k] и [ctrl+u] удаляют все перед или после курсора, [ctrl+w] удаляет слово перед курсором, [ctrl+r] делает поиск по истории команд (для отмены поиска нажми [ctrl+c], escape в командной строке не работает, для завершения поиска нажми стрелку вправо/влево), [ctrl+d] завершает работу и закрывает консоль.

Еще в линуксе и маке иногда не работают Home и End, используй [ctrl+a], чтобы перейти в начало строки и [ctrl+e], чтобы в конец. [alt + b] (back) и [alt + f] (forward) двигают курсор на 1 слово назад/вперед.

В линуксовой и маковской файловой системе нет букв дисков. Пути к файлам там начинаются из единого корня, и используют прямой слеш (например /home/ivan/file.txt ), а дополнительные диски (например USB-носители) монтируются в одну из папок внутри файловой системы (например /mnt/flash ). В линуксе регистр букв в имени файла имеет значение.

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

Пути к файлу в Windows используют бекслеш (например d:\tmp\file.txt ), а регистр букв в них не имеет значения.

В командной строке обычно не работает ctrl+v,c,x для вставки, копирования и вырезания текста. Иногда (зависит от настроек системы) вставить текст можно через [shift+ins], иногда правой кнопкой мыши. Погугли, как это делается в твоей ОС.

Скопировать текст обычно можно, выделив мышью (в Windows надо разрешить выделение текста, нажав правой кнопкой на заголовок, зайдя в настройки окна, и также нажать Enter после выделения).

В командной строке результат выполнения команд часто зависит от того, в каком каталоге и на каком диске ты находишься. Также, когда ты указываешь в команде относительное имя файла (без полного пути и имени диска), оно ищется в текущем каталоге.

Какой каталог текущий, в Windows написано в подсказке, а в linux можно узнать командой pwd (print working directory)

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

В Windows, сначала надо перейти на нужный диск командой c: , d: , e: и так далее. Потом использовать cd или chdir :

Обрати внимание, windows и linux используют разные виды слешей. Обрати внимание, .. обозначает «родительский каталог». Обрати внимание, только в линукс и мак

обозначает «домашний каталог» (это /home/username или /Users/username ). . (одна точка) обозначает текущий каталог и cd . никуда не перейдет. / (линукс) или \ (Windows) обозначает корневой каталог.

В Windows 7 и выше можно открыть окно консоли с заданной текущей папкой. Есть 2 способа, как это сделать:

  1. зажав shift, щелкнуть правой кнопкой по пустому месту в открытом окне папки, из появившегося меню выбрать пункт «command line here» («открыть командную строку»)
  2. поставить курсор в адресную строку в окне папки, ввести cmd и нажать Enter

Если тебе часто в windows приходится открывать консоль в какой-то папке (например папке с твоими программами), ты можешь создать на рабочем столе ярлык (правой кнопкой на рабочем столе → создать ярлык → ввести cmd, нажать «Далее» → ввести название, нажать «Готово» → зайти в свойства ярлыка → указать рабочую папку, нажать «ОК»). При запуске ярлыка будет открываться командная строка с выбранной текущей папкой.

В линуксе/маке, чтобы быстро перейти в нужную папку, можно набрать cd и перетащить в консоль иконку папки — должен вставиться полный путь к ней. Не гарантирую что это работает во всех дистрибутивах линукса, на маке работает.

В linux — команда clear или клавиша [ctrl+L], в windows — команда cls (clear screen).

Посмотреть, какие файлы есть в текущем каталоге, можно командой dir в Windows и командой ls в линуксе ( ls -a — показывает все файлы, включая скрытые, ls -l — показывает не только имена, но и размер, дату создания файла, права на него).

Посмотреть права на файл в Линукс можно либо командой ls -l , либо stat file.txt

Команды и оболочка

Оболочка — это cmd.exe в Windows и bash в линукс, это та программа, которая собственно мигает курсором и выполняет твои команды. Ты набираешь команды, а она их выполняет. Команда обычно состоит из имени команды, и, иногда, дополнительных параметров, отделенных пробелом, вроде:

Подсказка и получение помощи

Почти у любой команды есть подсказки. Чтобы их увидеть, добавь к имени команды параметр ( —help или /? ):

В линукс: ls —help — выведет справку по команде ls

В линукс: man bash — выведет подробную длинную справку по команде bash (для выхода жми q, для прокрутки используй стрелки и PgUp/PgDn). Также, man bash можно набирать в поисковой системе (Гугл, Яндекс) — скорее всего она покажет ссылку на тот же самый мануал.

Также, для Линукса есть прекрасный сайт https://explainshell.com/ , который умеет для введенной команды находить мануал по ней и выводить объяснения каждого аргумента. Он полезен, когда ты видишь где-то в статье команду и хочешь понять, что делает каждая опция в ней. Пример объяснения для команды ls -la /tmp. В Хроме и ФФ также можно нажать правой кнопкой мыши в поле поиска, выбрать там пункт вроде «Добавить как поисковую систему», задать для него ключевое слово (например, exp) и тогда запрос можно будет писать прямо в адресной строке браузера как exp ls -la /tmp .

В Windows: dir /? — выведет справку по команде dir

В Windows: help выведет подсказку по основным командам

Команды бывают внутренние (это маленький список команд, встроенных в оболочку). Встроенные команды — это, например, cd в линукс или exit в Windows. Их мало.

Внешние команды — их большинство — это фактически программы, лежащие на диске. Оболочка ищет их не по всему диску, а только в заранее заданных папках. Список папок перечислен в специальной переменной PATH. Просмотреть эту переменную можно так:

В линуксе: echo $PATH

В windows: echo %PATH%

В linux PATH — это папки /bin, /usr/bin, /usr/local/bin, /sbin, /usr/sbin, именно в них в Линуксе хранятся почти все программы. В текущем каталоге программы не ищутся, если это не указать явно, набрав ./command .

В Windows PATH — это всякие системные папки вроде c:\windows, c:\windows\system32 и так далее + текущий каталог, в котором ты находишься. Заметь, что папки вроде c:\program files\autocad в PATH не добавлены и в Windows таким образом, из командной строки обычные программы, установленные в Program Files, не запустить. Только то, что положено в системные папки.

Таким образом: если ты под линуксом, и ты набираешь команду php , то скорее всего файл php лежит в одной из *bin папок и эта команда запустит php. Если ты под Windows установил php допустим в c:\php, и не прописал этот путь в PATH, то набрав php , оболочка не найдет файл php.exe и ничего не запустит. И ты скажешь «что за кривой мануал, ничего не работает».

Что же делать? Есть 2 варианта:

  1. добавить папку с php в PATH через мой компьютер — свойства и перезалогиниться в систему
  2. писать вместо php полный путь c:\php\php.exe

Продолжаем. Допустим, ты хочешь запустить в командной строке файл my.php , который находится в текущем каталоге:

Допустим, ты хочешь запустить php-файл не из текущего каталога. Тогда надо написать путь к нему:

В общем, проще запускать файлы из текущего каталога, чем мучаться с путями.

Больше команд — linux

Попрактиковаться в линукс в командной строке можно на таких командах:

  • Создать текстовый файл: cat > file.txt [enter] ввести текст [enter][ctrl+d] — и файл создан
  • Создать текстовый файл содержащий данную строку: echo Hello World > file.txt
  • Просмотреть текстовый файл: cat file.txt
  • Просмотреть огромный текстовый файл, который не влезает на экран: cat file.txt | less или less file.txt . В просмотрщике работают стрелки и q для выхода (escape не работает).
  • Удалить файл: rm file.txt
  • Скопировать файл: cp file.txt copy.txt
  • Переместить/переименовать файл: mv file.txt copy.txt
  • Скопировать в другую папку: cp file.txt /some/other/directory
  • Запустить команду и сохранить ее вывод в файл, не выводя на экран: ls -la > file.txt (эта команда выведет список файлов, но не на экран, а сохранит в файл. Бывает иногда полезно).
  • Запустить команду, вывести результат на экран и сохранить в файл: ls | tee -a file.txt
  • Вывести файл, но не весь, а только первые 10 строк: cat file.txt | head -10
  • Вывести последние 10 строк файла: cat file.txt | tail -10
  • Следить за обновлением файлов и выводить в консоль новые строки, которые в них дописывают: tail -f file1.txt file2.txt (удобно так мониторить логи)
  • Вывести только строки файла, содержащие слово «dog»: cat file.txt | grep -i dog ( -i значит игнорировать регистр букв)
  • Найти файлы, в имени которых есть «dog», в каталоге /tmp: find /tmp -iname ‘*dog*’
  • Узнать текущее время: date
  • Создать папку: mkdir folder
  • Удалить папку: rm -r folder
  • Померять, сколько времени выполнялась команда: time [команда]
  • Узнать свой id пользователя: id
  • Показать список запущенных процессов: ps -lax
  • Показать что-то вроде диспетчера задач: top (для выхода q)
  • Запустить редактор, из которого хрен выйдешь, так как никакие привычные кнопки не работают: vi (попробуй :q! если все-таки в него попал)
  • Запустить нормальный редактор файла: nano file.txt

Подробнее о работе команд можно узнать с помощью параметра —help , дописанного после команды.

Больше команд — Windows

Попрактиковаться в командной строке в Windows можно так:

  • help — выводит список полезных команд
  • dir — выводит файлы в каталоге
  • Создать текстовый файл: copy con file.txt [enter]ввести текст[enter][ctrl+z][enter] — файл создан
  • Просмотреть текстовый файл: type file.txt
  • Просмотреть огромный текстовый файл: type file.txt | more (enter — прокрутка, q — выход)
  • Удалить файл: del file.txt
  • Скопировать файл: copy /b file.txt copy.txt
  • Переименовать файл: ren file.txt copy.txt
  • Запустить команду и сохранить вывод в файл: dir /? > file.txt
  • Создать текстовый файл с одной строкой текста: echo lalala lololo > file.txt
  • Дописать строчку в конец файла: echo boom >> file.txt
  • Создать папку: mkdir folder
  • Удалить папку: rmdir folder
  • Узнать текущее время: time и date (ctrl+с для выхода)

Подробнее о работе команд можно узнать с помощью параметра /? , дописанного после команды.

Команды для работы с сетью Интернет

В линукс: показать информацию о настройке сети: ifconfig (или /sbin/ifconfig если у тебя в PATH нет /sbin)

В Windows показать информацию о сети: ipconfig

Пропинговать (проверить связь) с сервером: ping google.com

Узнать IP по имени домена: nslookup yandex.ru

Показать список открытых с компьютера сетевых соединений: netstat -an (в подсказке по команде указаны также параметры, с помощью которых, например, можно вывести какая программа установила это соединение).

Проверить путь до какого-то сервера или узла сети:

  • в Windows: tracert google.com
  • в linux: traceroute google.com (не работает? пиши /usr/sbin/traceroute или пропиши уже себе sbin в PATH)

Используй ключи —help и /?

Гугли мануал по командной строке windows/linux в интернете.

Продвинутые возможности командной строки линукса

Этот раздел читать необязательно, но если ты хочешь знать больше, то пожалуйста.

  • версию php можно узнать либо добавив ключ —version, либо -v: php —version
  • список установленных модулей: php -m
  • вывести конфигурацию (список текущих настроек) PHP: php -i

Потоки и перенаправления.

В мире Линукс (да и в Windows тоже) у каждой программы обычно есть 3 потока (они имеют номера):

#0 — стандартный ввод — это поток из которого программа читает данные. По умолчанию в него поступает то, что ты набираешь на клавиатуре в консоли. Т.е. по умолчанию программы читают данные с клавиатуры.

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

#2 — поток ошибок. Сюда правильно написанная программа пишет сообщения об ошибках, о ходе выполнения задачи. Для них специально предусмотрен отдельный поток (чтобы при сохранении результатов работы в файл в него не записывались сообщения о ходе работы), но по умолчанию так же как и #1 он подключен к консоли.

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

Пайп (вертикальная черта) позволяет перенаправить выход одной программы на вход другой. Программа ls выводит список файлов в каталоге. Программа head -10 читает строки с стандартного ввода и выводит только первые 10 из них. Объединив эти команды, можно вывести имена первых 10 файлов:

В линуксе есть и другие команды фильтры, которые можно применять вместе с пайпом. Это sort (сортирует результаты и позволяет удалять дубликаты), grep слово (отбирает строки, в которых встречается заданное слово), head -N (выводит первые N строк), tail -N (выводит последние N строк) и другие.

Перенаправить стандартный вывод в файл можно так:

В этом случае результат работы ls запишется в файл. При этом поток ошибок останется неперенаправленным и они будут выводиться в консоль — именно для этого эти потоки разделены.

Перенаправить поток ошибок в файл можно так:

команда 2> file.txt

Перенаправить и вывод, и ошибки в файл можно так:

команда 2>&1 > file.txt

Когда вывод перенаправлен в файл, ты не видишь ничего в консоли. Для борьбы с этим есть команда tee , которая расщепляет поток: одна копия идет в файл. другая выводится в консоль:

команда 2>&1 | tee file.txt

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

Все эти программы берут данные со стандартного ввода, обрабатывают и выдают результат на выход. Они предназначены для совместного использования с перенаправлением потоков ввода/вывода.

  • grep , egrep — отбирает только строки, соответствующие (или не соответствующие) регулярному
  • sort — сортирует поданные на вход строки
  • cat -n — нумерует поданные на вход строки
  • head , tail — берут первые или последние строки
  • tac — читает строки с входа, переворачивает их и выдает в обратном порядке
  • tr — заменяет указанные символы
  • sed — позволяет делать более сложные замены, например sed -rn ‘s!value=(\d+)!\1\n!gp’ найдет во входном тексте строки вида value=123, выделит из них числа и выведет их каждое на своей строке
  • gzip / gunzip — архивируют/разархивируют данные
  • wc — считает число строк, слов и символов во входном файле
  • cut — разбивает каждую строку на куски по символу-разделителю и вырезает указанные куски

Команда diff file1 file2 сравнивает 2 файла и выдает список различий в них. Она также умеет сравнивать папки с вложенными в них файлами рекурсивно.

Если установить команду pv то можно выводить шкалу прогресса. Допустим мы подаем огромный файл на вход команды и хотим следить сколько байт уже передано. Команда pv перекачивает данные со своего входа на выход, при этом считая их и выводя полоску прогресса:

cat file.txt | pv | другая команда

Скачать файл можно командой wget: wget -O file.txt ‘http://example.com/download/file’ Кавычки нужны.

Можно отправлять POST- и GET-запросы, например, для тестирования твоего приложения, командой curl:

curl -F name=Username -F ‘comment=Hello World’ ‘http://example.com/post/comment’

С помощью программы gzip / gunzip можно сжимать файлы. По умолчанию она берет данные, поступающие на стандартный вход, сжимает и выдает на выход. Степень сжатия задается параметрами от -1 (минимальная) до -9 (максимальная).

  • сжать файл на диске: cat file.txt | gzip -9 > file.txt.gz
  • разжать файл и вывести на экран: cat file.txt.gz | gunzip
  • выполнить команду, сжать и сохранить в файл ее результат: команда | gzip -9 > file.txt.gz

Если команда выводит очень много данных, удобно направить ее вывод в программу-пейджер less. Она позволяет прокручивать результат стрелками, искать по регулярке командой / (n — перейти к следующему результату). Для выхода жми q, escape не работает. Во как направить вывод в less:

Если надо туда же направить и поток ошибок то пиши так:

Некоторые настройки хранятся в переменных окружения. Например, путь к домашнему каталогу хранится в $HOME и вывести ее можно так:

Поменять переменную можно так: export VAR=value . Обрати внимание, у каждого процесса свой набор переменных, и они наследуются от родителя при создании процесса так что поменять переменные ты можешь только у программ, которые будут запускаться в этой консоли в дальнейшем, а у уже запущенных не поменяешь. Также, можно поменять переменную только для одной запускаемой команды, так:

VAR=value команда , например SOME_VAR=1 OTHER_VAR=2 php file.php

Cmd- и bash-скрипты

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

В Windows скрипты для командной строки (пакетные скрипты) должны иметь расширение .bat или .cmd . В них пишутся команды, которые надо выполнить, каждая на новой строке, например:

Как видно, кроме полезных команд, тут есть несколько дополнительных строк. Команда echo off отключает вывод команд в консоль перед их выполнением, а знак @ отключает вывод самой команды echo off . Команда REM позволяет добавить комментарии в текст скрипта. Запускается скрипт просто указанием его имени (с указанием пути, если скрипт не находится в текущей папке или PATH ). При этом будет неявно запущен интерпретатор cmd.exe и он будет выполнять команды из указанного файла:

В скриптах также можно использовать переменные окружения, создавать ветвления ( IF ) и циклы ( FOR ).

Подробнее про скрипты CMD в Windows:

Возможности bat-скриптов очень ограниченны, потому на смену им Microsoft разработала мощный интерпретатор Powershell и язык скриптов для него.

В linux (и mac) любой текстовый файл можно сделать исполняемым, если поставить ему флаг execute (признак, что файл исполняемый) командой chmod +x file.xyz и в первой строке файла указать специальную конструкцию под названием shebang ( #! ), за которой указан полный путь к программе-интерпретатору. Ну например, если у нас есть PHP-файл, мы можем сделать его исполняемым и написать в начале строку (обратите внимание, если файл сохранен в кодировке utf-8, в нем не должно быть BOM):

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

Если в качестве интерпретатора прописать путь к оболочке bash, то получится bash-скрипт. В нем указываются команды, которые надо выполнить, каждая на новой строчке, например:

Здесь использованы дополнительные конструкции: set -e — говорит, что при ошибке выполнения любой команды скрипт завершается (без этого скрипт бы продолжил выполняться), символ # обозначает комментарий. Язык bash довольно мощный, в нем есть ветвления ( if ), циклы ( for , while ), функции и переменные.

Для bash-скриптов обычно либо указывают расширение .sh , либо никакого расширения. В linux, как было написано выше, интерпретатор для файла определяется первой строчкой в нем, а не расширением.

Пакетный менеджер в Дебиан/Убунту

Линуксоиды — суровые занятые люди и меньше всего им хочется ради установки программы что-то искать, скачивать, проверять на вирусы, запускать, жать далее, обнаружить что надо сначала поставить NET framework и так далее, а потом отвечать на вопросы типа «Не хотите ли проверить обновления?». Они придумали другой способ: на сервере создается репозиторий пакетов с программами, а пользователь несколькими командами может найти и установить нужный. В Debian используются пакеты формата deb и программа apt-get .

Для начала надо скачать свежий список пакетов:

sudo apt-get update

Эту команду стоит делать если ты давно ее не делал. Теперь список пакетов скачан и можно воспользоваться поиском. попробуем найти Апач:

apt-cache search apache | sort

Заметь, этой команде права рута не нужны. Команда sort сортирует результаты. Среди кучи результатов видим:

apache2 — Apache HTTP Server metapackage

Попробуем его установить. Это делается командой apt-get install (имена пакетов):

sudo apt-get install apache2

Готово! При этом команда install автоматически обновит имеющиеся у тебя программы и библиотеки, если для них вышла более новая версия. Заметь, что ты можешь указать много пакетов сразу:

sudo apt-get install apache2 php5-common php5-curl

С помощью apt-get и заготовленного списка пакетов можно одной командой установить на сервер весь нужный софт. Так-то! Просмотреть установленные пакеты можно командой dpkg-query -l

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

Пакеты, которые стоит установить сразу:

apache2 apache2-mpm-prefork php5 php5-cli php5-curl php5-dev php5-gd php5-gmp php5-imap php5-intl php5-mcrypt php5-mysqlnd php5-xdebug php5-xsl — думаю понятно что это.

  • git — система управления версиями, она тебе понадобится чтобы коммитить код на гитхаб.
  • htop (линуксовый цветной диспетчер задач, попробуй его запустить, q = выход)
  • iftop (показывает какая программа куда соединяется и сколько трафика качает)
  • iotop (показывает кто мучает диск)
  • mc (файловый менеджер и редактор mcedit)
  • nano (простой текстовый редактор)
  • sysv-rc-conf (включает и выключает службы в автозапуск)

Чем править конфиги

Удобно использовать редактор nano, который часто предустановлен в линуксе. Горячие клавиши в нем подписаны внизу экрана.

Или же mcedit, который входит в состав файлового менеджера mc. Пиши например sudo mcedit /etc/apache2/httpd.conf и редактируй. Кнопки: F2 — сохранить, F10 — выйти, F7 − искать, Shift + F7 — искать еще, Esc + Tab — автодополнение. Escape как «отмена» работает, но надо жать 2 раза.

sudo less /var/log/apache2/error.log sudo tail /var/log/messages

Отслеживать лог в реальном времени (попробуй): sudo tail -f /var/log/error.log

Поиск в логе через grep:

cat /var/log/messages | grep -i word

Для доступа к логам не нужны будут права админа если ты добавишь себя в группу adm.

Управление службами (апач. mysql): sudo service mysql действие

Где действие — это:

  • start = запустить
  • stop = остановить
  • restart = перезапустить
  • reload = обновить настройки из конфига (если ты его правил например) без остановки работы службы. То есть сайт ни на секунду не перестанет работать (в случае с restart — перестанет на несколько секунд). Не все службы это умеют, но если умеют то это удобно.

Выбор какие службы будут запускаться при загрузке: sudo sysc-rc-conf , для выхода жми q.

Лекция 3. Работа в оболочке ОС, написание скриптов

Работа в текстовой оболочке операционной системы (ОС)

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

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

Текстовые оболочки допускают как интерактивный режим — пользователь вводит команды и наблюдает их результат, так и «пакетный» (batch) — пользователь может создать файл со списком команд, которые будут выполняться автоматически. Кроме того, в текстовых оболочках присутствуют средства, позволяющие комбинировать работу нескольких программ — вывод одной программы связывать со входом другой.

На сегодняшней лекции мы будем рассматривать основные команды и принципы работы в оболочках cmd.exe на Windows и Bash на Linux и macOS.

Для запуска оболочки cmd.exe на Windows нужно найти пункт меню «Командная строка» в группе «Служебные — Windows» в меню «Пуск»:

  • «Пуск» → «Служебные — Windows» → «Командная строка» (Windows 10)
  • «Пуск» → «Программы» → «Служебные» → «Командная строка (Windows 7)

Для запуска оболочки на Linux и macOS нужно найти приложение «Терминал» или «Консоль» (в разных дистрибутивах Линукса оно может называться по-разному)

Командная строка Windows:

win-console.png

Командная строка Linux или macOS (выглядит примерно так):

posix-console.png

У оболочки есть так называемое приглашение — место на экране для ввода команды. В командной строке Windows приглашение выглядит так:

В нём отображается путь к текущей папке (у оболочки, как и у любой другой программы, есть текущая папка) и знак > . Пользователь вводит команды после знака > .

В оболочке Bash (используемой по умолчанию на Linux и macOS), приглашение выглядит так:

В нём отображается имя текущего пользователя, имя компьютера, знак : , путь к текущей папке (знаком

отображается домашняя папка) и знак $ , после которого пользователь вводит команды.

Команды оболочки позволяют перемещаться по папкам, манипулировать файлами (копировать, переименовывать, перемещать, удалять) и запускать другие программы. Команды в Командной строке Windows и Bash различаются.

Общий синтаксис команды:

Здесь ‹команда› — это имя команды, параметры — указание режимов работы команды и имён файлов, которыми команда манипулирует. Бывают команды, которые вообще не принимают параметры.

Имя команды отделяется от параметров пробелом, сами параметры тоже разделяются пробелами. Если имя команды или параметр сам должен содержать пробелы, то он заключается в кавычки: «двойные» (работают и на Windows, и на Linux/macOS) или ‘одинарные’ (работают только на Linux/macOS).

Команды бывают встроенные — обрабатываются самой оболочкой, либо являются именами программ.

Основные команды оболочки

Смена текущей папки, cd

cd ‹имя папки› , работает и на Windows, и на Linux, и на macOS.

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

Создание папки, mkdir

Для того, чтобы создать новую пустую папку, используется команда mkdir :

На Windows вместо mkdir можно использовать более короткий синоним md , на Linux и macOS — только mkdir .

Создание текстового файла

На Windows для создания текстового файла используется команда вида

после чего с клавиатуры нужно ввести содержимое файла. Ввод завершается нажатием клавиш Ctrl-Z и Enter.

На Linux и macOS нужно ввести команду

ввести содержимое файла и нажать комбинацию клавиш Ctrl-D.

Просмотр содержимого папки

На Windows используется команда dir , которая распечатывает содержимое папки, выводя сведения о каждом файле. Если команду вызвать с параметром /b , будут выведены только имена файлов. В папке New folder на данный момент всего один файл:

На Linux и macOS используется команда ls , которая распечатывает имена файлов в папке. Если указать параметр -l , то будут распечатаны подробные сведения:

Копирование файлов

На Windows используется команда

На Linux и macOS:

Для примера скопируем файл new file.txt в copy.txt :

Команда dir нам показала, что в папке теперь находятся два файла. Имя файла new file.txt нужно было заключать в кавычки, т.к. оно содержит пробел. Имя целевого файла copy.txt пробелов не содержит, поэтому кавычки не нужны.

Переименование файлов

На Windows используется команда

На Linux и macOS:

Переименуем файл copy.txt в backup.txt :

Перемещение файлов

На Windows используется команда move :

на Linux и macOS — mv :

Таким образом, на Linux и macOS используется одна и та же команда и для переименования, и для перемещения файлов.

Создадим папку nested в текущей папке и переместим в неё файл backup.txt :

Мы создали папку nested , переместили в неё файл backup.txt , посмотрели содержимое текущей папки и содержимое папки nested . Как видим, команда dir может принимать имя папки, содержимое которой нужно распечатать. Если имя не указано, то распечатывается содержимое текущей папки.

На Linux и macOS команда ls также поддерживает указание имени папки, которую нужно распечатать.

Удаление файлов

На Windows используется команда del или erase (это два синонима), которая принимает имя удаляемого файла:

На Linux и macOS такая команда называется rm :

Удалим файл backup.txt в папке nested :

Команды dir /b и ls ничего не вывели, т.к. папки пустые.

Удаление папок

Для удаления папки используется команда rmdir на всех трёх рассматриваемых операционных системах. На Windows можно использовать более короткий синоним rd . Команда rmdir ( rd ) может удалить только пустой каталог, в противном случае выдаст ошибку.

Удалим папку nested :

Просмотр содержимого файла

Для того, чтобы вывести на экран содержимое файла, на Windows используется команда type :

На Linux и macOS — cat :

Посмотрим содержимое файла new file.txt :

Очистка экрана

Чтобы стереть содержимое окна консоли, нужно выполнить команду cls на Windows или clear на Linux/macOS.

Запуск консоли Python в консоли оболочки

На Windows, если Python установлен правильно, нужно ввести команду python , на Linux и macOS — python3 (т.к. команда python без цифры на конце может запустить Python 2.7 на некоторых дистрибутивах Linux или версиях macOS).

Завершение работы в оболочке

Команда exit (работает везде) закрывает окно оболочки.

Запуск программ на Python в оболочке

Для запуска программы на Python’е нужно выполнить в оболочке команду

в зависимости от операционной системы.

Напишем программу, которая распечатывает фразу Hello, World! и запустим её.

На Windows программы на Python можно запускать, просто указывая имя исходного файла — интерпретатор Python будет вызываться автоматически:

На Linux и macOS, чтобы так сделать, нужно выполнить дополнительные действия: добавить в начало файла специальный комментарий

и пометить файл как исполнимый командной chmod +x .

Одна из особенностей оболочек Linux и macOS — для запуска программ из текущей папки нужно явно добавлять в начало ./ , к этому надо привыкнуть.

Стандартные потоки ввода-вывода

В операционных системах (и в Windows, и в unix-подобных системах macOS и Linux) для программ, запускаемых в консоли, доступны три стандартных потока ввода-вывода — три псевдофайла, посредством которых программы могут взаимодействовать с пользователем и друг с другом.

  • Стандартный ввод (условно называемый stdin ) — по умолчанию связан с вводом с клавиатуры.
  • Стандартный вывод ( stdout ) — по умолчанию связан с выводом текста на экран, предназначен для вывода полезных данных программы.
  • Стандартный вывод ошибок ( stderr ) — тоже по умолчанию связан с экраном, предназначен для вывода сообщений об ошибках.

Если программа запрашивает пользовательский ввод, то, как правило, она читает его из (псевдо)файла stdin , если печатает на экран — по умолчанию выводит в (псевдо)файл stdout .

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

Для того, чтобы ввести конец файла в операционной системе Windows, нужно нажать комбинацию клавиш Ctrl-Z (на экране высветится ^Z ) и после этого Enter. Для того, чтобы ввести конец файла в unix-подобных ОС, нужно нажать Ctrl-D.

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

Пусть есть некоторая команда program , которая принимает некоторые аргументы, кроме того, в процессе работы запрашивает пользовательский ввод с клавиатуры и выводит что-то на экран.

Для того, чтобы подменить пользовательский ввод на чтение текстового файла, нужно к команде запуска программы добавить < «имя-файла.txt» :

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

Рассмотрим следующую программу greeting.py :

(встроенная функция input() запрашивает ввод с клавиатуры)

Рассмотрим запуск программы обычным образом и с использованием перенаправления ввода:

Первый запуск демонстрирует ввод данных с клавиатуры ( stdin связан с клавиатурой): я вводил свои имя и фамилию (завершая ввод каждой строки нажатием на клавишу Enter, которая вводила и перевод строки тоже), набираемый мною текст отображался на экране и считывался из stdin встроенной функцией input() .

Далее, при помощи команды type я показал, что в данной папке есть текстовый файл input.txt с двумя строчками, в которых написаны, соответственно, имя и фамилия (из-за особенностей Windows, кириллица может считываться неверно).

В третьей команде я связал стандартный ввод stdin с файлом input.txt , в результате чего программа считывала данные не с клавиатурного ввода, а из текстового файла — на экране видно только то, что она выводит, но не считывает.

Можно считать, что при перенаправлении ввода стандартный ввод неявно считается файлом, открытым в режиме r (для чтения).

Стандартный вывод можно перенаправить двумя способами: для перезаписи и для дозаписи (сравни с режимами w и a функции open() в Python). Для того, чтобы стандартный вывод перенаправить в файл в режиме перезаписи (если файла не было, он будет создан, если файл был, его старое содержимое сотрётся), нужно к команде запуска добавить > «имя-файла.txt» , в режиме дозаписи (если файл был, то новые данные будут добавляться в конец) — >> «имя-файла.txt» :

Рассмотрим тот же пример:

В текущей папке появится файл output.txt со следующим содержимым:

Когда мы перенаправили вывод в файл output.txt , то, что программа до этого выводила на экран (строчку Введите ваше имя: и т.д.), она стала выводить в файл — свои имя и фамилию я писал практически наугад, не видя, что программа меня спрашивает.

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

Стандартный поток ошибок перенаправляют редко, для перенаправления используются похожие команды, но перед знаками > и >> нужно указать цифру 2 :

Описанный выше синтаксис связывания связывания стандартных потоков с файлами одинаково работает и в Windows, и в unix-подобных системах (macOS и Linux).

Связывать стандартные потоки можно не только с файлами, но и между собой. Если у нас есть две программы, одна из которых (назовём её prog1 ) пишет данные на stdout , а вторая (назовём её prog2 ) читает данные со стандартного ввода ( stdin ), то их можно связать в конвейер:

Стандартный вывод stdout программы prog1 будет связан со стандартным вводом stdin программы prog2 , то, всё, что будет выводить первая программа, будет считывать вторая программа.

В конвейере может быть сколько угодно команд:

Здесь у команд prog2 и prog3 связаны и стандартные вводы, и стандартные выводы.

В командной строке unix-подобных операционных систем имеется довольно много встроенных команд, предназначенных для обработки текстовых данных (выбор подстрок, сортировка строчек и т.д.), эти программы удобно комбинировать при помощи конвейеров. Командная строка Windows гораздо беднее на эти возможности.

Возьмём текстовый файл следующего содержимого:

jack.txt «` This is the house that Jack built. This is the malt That lay in the house that Jack built. This is the rat, that ate the malt That lay in the house that Jack built. This is the cat, That chased the rat, that ate the malt That lay in the house that Jack built. This is the dog, that worried the cat, That chased the rat, that ate the malt That lay in the house that Jack built. This is the cow with the crumpled horn, That tossed the dog, that worried the cat, That chased the rat, that ate the malt That lay in the house that Jack built. This is the maiden all forlorn, That milked the cow with the crumpled horn, That tossed the dog, that worried the cat, That chased the rat, that ate the malt That lay in the house that Jack built. This is the man all tattered and torn, That kissed the maiden all forlorn, That milked the cow with the crumpled horn, That tossed the dog, that worried the cat, That chased the rat, that ate the malt That lay in the house that Jack built. This is the priest all shaven and shorn, That married the man all tattered and torn, That kissed the maiden all forlorn, That milked the cow with the crumpled horn, That tossed the dog, that worried the cat, That chased the rat, that ate the malt That lay in the house that Jack built. This is the cock that crowed in the morn, That waked the priest all shaven and shorn, That married the man all tattered and torn, That kissed the maiden all forlorn, That milked the cow with the crumpled horn, That tossed the dog, that worried the cat, That chased the rat, that ate the malt That lay in the house that Jack built. This is the farmer sowing his corn, That kept the cock that crowed in the morn, That waked the priest all shaven and shorn, That married the man all tattered and torn, That kissed the maiden all forlorn, That milked the cow with the crumpled horn, That tossed the dog, that worried the cat, That chased the rat, that ate the malt That lay in the house that Jack built. «`

Для того, чтобы найти в нём все строки, в которых упоминается некоторая строчка, на Windows нужно использовать команду find «искомая строка» (кавычки обязательны), в unix-подобных системах — grep «искомая строка» (кавычки нужны, если в искомой строке есть пробелы).

Для примера, найдём в файле слово dog :

Программа find считывает строчки со стандартного ввода и выводит их на стандартный вывод. Аналогично работает и grep :

Команда sort (есть и там, и там) сортирует строки, считанные из stdin , и выводит их в алфавитном порядке на stdout (часть вывода опущена):

Найдём все строчки, содержащие слово This , отсортирует их по алфавиту и результат сложим в файл с именем this.txt :

В обоих случаях получим файл this.txt со следующим содержимым:

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

В обоих случаях у программы поиска подстроки ( find или grep ) стандартный ввод связывался с исходным файлом, стандартный вывод — со следующей программой в конвейере — командой сортировки sort . Её стандартный вывод перенаправлялся в целевой файл.

Для программ, работающих в командной строке, принято соглашение:

  • Если среди аргументов командной строки имена файлов не указаны, то чтение осуществляется со стандартного ввода.
  • Если имена файлов указаны, что обрабатываются все перечисленные файлы.
  • Результат работы программы выводится на стандартный вывод.

Таким образом, командам grep , find , sort и другим встроенным командам можно в командной строке указывать и имена файлов:

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

На Windows наиболее употребительными являются файлы с именами nul и con . Чтение из файла nul сразу же приводит к обнаружению конца файла (т.е. этот файл воспринимается как пустой), запись в него игнорируется. Чтение из файла con соответствует чтению с клавиатуры (даже если стандартный ввод перенаправлен), запись в него соответствует записи на экран (даже если перенаправлен станадартный вывод). Файлы nul и con неявно присутствуют в каждой папке.

На unix-подобных системах чаще всего используется файл /dev/null , аналогичный файлу nul на Windows: при чтении он воспринимается как пустой (сразу же встречаем конец файла), при записи записываемые данные игнорируются.

Файлы nul и /dev/null используются в командной строке для того, чтобы подавить вывод на экран:

С псевдофайлом con мы работали, когда создавали текстовый файл из командной строки на Windows:

Команда cat в unix-системах читает указанные в командной строке файлы и выводит их содержимое на стандартный вывод. Если файлы не указаны, то она выводит на стандартный вывод содержимое стандартного ввода. Когда мы создавали файл в командной строке Linux, мы просто перенаправляли стандартный вывод:

Взаимодействие программ на Python с операционной системой

Для взаимодействия с операционной системой используется модуль os , подключаемый командной

Чтобы посмотреть перечень всех доступных средств, нужно в среде IDLE ввести следующую команду:

Нам все эти средства не нужны, кроме двух основных:

  • доступ к стандартным потокам ввода-вывода,
  • доступ к аргументам командной строки.

Стандартные потоки ввода-вывода доступны как переменные

  • sys.stdin
  • sys.stdout
  • sys.stderr

В этих переменных находятся объекты файлов, связанные со стандартными потоками. Их можно использовать в файловых операциях точно также, как и объекты файлов, полученные из функции open() .

При запуске программ в среде IDLE конец файла для sys.stdin вводится как Ctrl-D в новой строчке независимо от операционной системы, вывод на sys.stdout отображается синим цветом, на sys.stderr — красным цветом.

Пример: используем .readlines() для sys.stdin .

Пример: выводим на sys.stderr :

Мы говорили о том, что функция print() по умолчанию пишет на экран, чтобы перенаправить вывод в файл, мы использовали параметр file= . Если быть точным, функция print() всегда пишет в файл, по умолчанию file=sys.stdout .

Для доступа к аргументам командной строки используется переменная sys.argv , в которой находится список аргументов. Этот список всегда непустой, т.к. значением нулевого элемента списка sys.argv[0] является имя самой запущенной программы. Для примера создадим файл test-argv.py со следующим содержимым:

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

Пробел между словами with space стал частью параметра, т.к. внутри кавычек, пробел между словами without и space стал разделителем параметров.

Пример. Напишем программу cat.py , имитирующую работу программы cat в unix-системах. Программа cat читает файлы, перечисленные в командной строке, каждый из них открывает и выводит его содержимое на стандартный вывод. Если имена файлов отсутствуют, то читается стандартный ввод.

Программа написана в рекомендуемом стиле для консольных программ.

В программе объявлены две функции main() и process_stream() , в самом конце вызывается функция main() . Условие __name__ == «__main__» выполняется всегда при обычном запуске программы.

За счёт того, что основной код программы сосредоточен в функции main() , а не «размазан» по всему исходнику, понимание программы упрощается, кроме того, в основном коде мы можем вызывать функции до их объявления.

Функция main() описывает обычную логику для консольных программ: обрабатывать либо файлы (если указаны явно), или стандартный ввод. Поскольку обработка и того, и другого выполняется одинаково, эта логика вынесена во вспомогательную функцию process_stream() .

Убедимся, что функция работает, как мы ожидаем:

Мы видим, что поведение встроенной программы cat и написанной нами cat.py идентично на Linux. Кроме того, программа cat.py будет работать и на Windows:

Пример. Напишем программу grep.py , имитирующую работу встроенной программы grep unix-подобных систем. Программа принимает в качестве первого параметра искомую подстроку, после которой может следовать несколько имён файлов. Программа выводит все строки указанных файлов, содержащие данную подстроку. Если указано два и более файлов, то в начало выводимой строки добавляется имя сканируемого файла. Если файлы не указаны, читается стандартный ввод. Программа может принимать ключ -v , говорящий о том, что вывод нужно инвертировать, т.е. выводить строки, не содержащие указанной подстроки.

(На самом деле, сходство будет неточное, т.к. программа grep принимает шаблон, а наша программа — подстроку. Кроме того, ключей у команды grep на самом деле очень много, а у нас будет только один -v .)

Для простоты будем считать, что ключ -v указывается перед искомой подстрокой.

Функция process принимает, помимо потока, который нужно просканировать, искомую строку, имя файла и факт наличия параметра -v . Переменная prefix содержит строку, добавляемую в начало вывода каждой строки: она пустая, если имя файла печатать не надо (сканируется стандартный ввод или файл один), в ней имя файла и двоеточие в остальных случаях.

Код функции process можно несколько сократить:

Можно убедиться, что написанная программа правильно повторяет поведение встроенной команды grep :

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *