1 что такое язык оболочки командной строки
Интерпретатор командной строки, или shell (shell — оболочка) — эта та программа, которая принимает команды от пользователя и исполняет их.
- Взаимодействие с пользователем (редактирование командной строки, история команд и т.д.).
- Обработка (расширение) шаблонов имен (» * «, » ? » и т.д.).
- Перенаправление ввода/вывода команд.
- Управление заданиями.
Кроме того, shell — это специализированный язык программирования, в котором есть переменные, конструкции while, if, for и т.д., функции и много чего еще. Он позволяет писать как несложные сценарии для автоматизации повседневных задач, так и довольно сложные программы (например, запуск и останов большинства Unix’ов производятся сценариями на языке shell).
Хотя работа непосредственно в командной строке (а не в оболочке типа NortonCommander или какой-нибудь оконной) на первый взгляд не столь удобна, она обеспечивает более удобный доступ к таким функциям, как перенаправление ввода/вывода и управление заданиями — оболочки типа Midnight Commander в этом случае будут только мешать.
Shell — это не одна конкретная программа. Исторически существует несколько подвидов оболочек; «генеалогическое древо» представлено на Рис.1.
| Рис.1: семейство интерпретаторов командной строки |
Не вдаваясь в подробности истории (краткое описание можно найти в разделе 3.10 книги «Unix: универсальная среда программирования» Кернигана и Пайка), стоит лишь заметить, что csh и tcsh не в полной мере реализуют командный язык sh, а zsh, являясь самой последней разработкой, умеет все, что и любой другой подвид, и плюс много чего еще.
Кроме того, поскольку командный интерпретатор имеет десятки параметров для настройки, не следует удивляться, увидев, что некая знакомая оболочка на другом компьютере выглядит и ведет себя по другому.
Изложение в данном разделе основано на zsh (которая и используется на практических занятиях), но большая часть описанного верно и для других оболочек.
1 что такое язык оболочки командной строки
Командная оболочка может читать команды из файла, а может воспринимать команды, набранные пользователем на клавиатуре. В последнем случае говорят, что оболочка работает в интерактивном режиме.
Вот скриншот программы xterm :

На нём видно, что только что была запущена команда ls / , она напечатала кое-что на экране и теперь можно вводить новую команду. Силуэт Главного здания МГУ выводится единожды при запуске командной оболочки zsh (так уж настроен мой компьютер), после чего появляется так называемое приглашение.
Некоторые программы выводят много текста в окно терминала, но из-за прокрутки в окне видно только его окончание — то, что помещается в окне. Тем не менее программа-терминал обычно хранит несколько сотен последних строчек в своей памяти, и имеется возможность промотать текст обратно. В xterm для этого нужно нажимать Shift + Up (прокрутка по строкам) Shift + PgUp (по страницам). Соответственно, обратная прокрутка осуществляется комбинациями клавиш Shift + Down (прокрутка по строкам) Shift + PgDown (по страницам).
В дальнейшем в этом руководстве подобные примеры будут приводиться не в виде скриншотов, а вот таким образом:
° ║ █ ▓▓▓ ■ ▐▒▒▒▒▒▌ ■ ▒▒▌ ▐▒▒▒▒▒▌ ▐▒▒ ____ ▒▒▌▄▄▄▐▒▒▒▒▒▌▄▄▄▐▒▒ ____ ▒▒▒▒▄▄▒▒▌▓▓▓▐▒▒▒▒▒▌▓▓▓▐▒▒▄▄▒▒▒▒ ▒▒▒▒╦╦▒▒▌▓▓▓█▓╦╦╦▓█▓▓▓▐▒▒╦╦▒▒▒▒[2:10:28][tz@coneforest ~/work]%ls /arch/ dev/ initrd/ media/ noah/ root/ tmp/ bin/ etc/ lib/ misc/ opt/ sbin/ usr/ boot/ home/ lost+found/ mnt/ proc/ sys/ var/[2:10:35][tz@coneforest ~/work]%
[2:10:35][tz@coneforest ~/work]%
и есть уже упомянутое приглашение. Его вид и содержание можно как угодно настроить. В нашем примере приглашение содержит время, в которое оно появилось на экране. Кроме того, из приглашения видно, что мы вводим команды в качестве пользователя tz на компьютере coneforest , и текущей директорией для нас служит ~/work . Подробнее обо всех этих вещах написано в следующих главах.
В тех примерах, где содержание приглашения не важно, мы будем изображать его просто как знак процента:
%ls /
Этот знак не является частью команды, и набирать его не нужно. То, что пользователь вводит, показано наклонным шрифтом.
Командная строка и графический интерфейс
Не обязательно запускать команды только лишь описанным выше способом. Графическая оконная система предоставляет и другие возможности: меню, пиктограммы (иконки) на рабочем столе, клавиатурные сочетания. С каждым пунктом меню или пиктограммой на рабочем столе связана определённая команда, которая запускается при выборе этого пункта меню или при щелчке (возможно, двойном, зависит от настроек) на пиктограмме, при нажатии определённого сочетания клавиш или при определённом мышином жесте.
Однако многие программы в Linux могут запускаться с различными ключами и параметрами, и указание параметров при запуске программы при помощи мышки становится невозможным.
К примеру, если вы желаете запустить веб-броузер так, чтобы в нём сразу открылся документ по определённому адресу, или открыть в офисной программе конкретную электронную таблицу, или посмотреть конкретный видеофайл, то потребуестся на рабочем столе создать ярлык для соответствующего веб-адреса, электронной таблицы, видеофайла, и щёлкать мышью на этот ярлык. Тогда будет запущена программа, которая (в силу настроек) связана с документами того типа, на который ссылается ярлык.
Допустим, что программой, которая назначена для открытия веб-адресов, это Konqueror , но вы по какой-то причине хотите её открыть в Seamonkey . Тогда щёлкаем на ярлык правой кнопкой мыши, и в появившемся меню выбираем Открыть с помощью… , а затем в появившемся диалоге мучительно отыскиваем и выбираем программу Seamonkey .
Такая последовательность действий является единственно возможной для новичков, и хорошо, что имеется такая возможность. Однако для быстрой, профессиональной работы такой подход совершенно не годится. Он требует большого напряжения от пользователя (напряжения зрения, руки, держащей мышку, умственных усилий). То, что хорошо для новичка, становится невыносимым для профессионала.
Излишняя привязанность к мыши становится похожей на привязанность малыша, который учится ходить, к ходункам. Ребёнок, которому давно пора кушать ложечкой, по-прежнему тянется к любимой соске. Выздоровевший человек не может расстаться с костылями.
Между тем мы считаем, что клавиатура является гораздо более гибким инструментом, чем мышка, а язык команд — более универсальным способом управления компьютером.
Операционная система Linux в большей степени, нежели многие другие, приспособлена к профессиональной работе. Даже ввод команд в терминале оказывается не столь утомителен, как можно подумать.
|
![]() |
|
| Предисловие | ![]() |
Удобства при работе с командной строкой |
Командная строка — Основы командной строки
Для работы с командной строкой понадобятся две вещи: терминал и командная оболочка. В этом уроке вы узнаете, как они работают и чем отличаются друг от друга.
Терминал
Терминалом называют программу, которая эмулирует поведение железного терминала, состоящего из клавиатуры и монитора. В простейшем случае — это просто окошко с командной строкой внутри:
Хороший терминал все же не ограничивается одним окном, а позволяет открывать новые терминалы в табах — по такому же принципу, как работают вкладки в браузере.
Некоторые терминалы позволяют делать сплиты, то есть разделять окно на части. Этот довольно удобный механизм есть, например, в iterm2 :
Хорошие терминалы также умеют восстанавливать завершенную сессию, создавать профили под разные задачи и многое другое.
Командная оболочка
Командная оболочка — программа, через которую пользователь или администратор управляет операционной системой и установленными программами, используя командную строку. У этого понятия множество синонимов — shell, командный интерпретатор и командный процессор.
Оболочка — это лишь средство для выполнения определенных задач, а не сама задача. Этим она отличается от многих других программ.
Внутри терминала пользователь передает системе строки:
Каждая строка — это команда, которую система должна выполнить. После ввода команды обязательно нажать Enter , только в этом случае команда отправится на исполнение. После нажатия Enter отредактировать команду уже нельзя.
Оболочка запускается внутри терминала и приглашает ко вводу команд:
Рассмотрим фрагмент кода подробнее. Мы видим:
- Символ $ — он используется как разделитель
- Слева от $ — настраиваемое сообщение для вывода, обычно это текущая директория
- Справа от $ — команда, которую вводит пользователь
Все примеры в дальнейшем будут демонстрироваться без этого сообщения и символа. Рассмотрим для примера команду date , которая выводит текущую дату:
date Sun Aug 26 14:02:59 CEST 2018 █
Другой пример команды — комментарии. Как и в любых языках программирования, они ни на что не влияют. С их помощью мы просто описываем происходящее:
# Комментарий █
Командная оболочка позволяет запускать на выполнение установленные программы. Но это далеко не все, на что она способна. Для комфортной работы полезно иметь:
- Автоматическое завершение имен программ и файлов
- Историю введенных команд
- Возможность перемещаться по файловой системе
- Удобные горячие клавиши
- Поддержку скриптов
Далее в курсе мы раскроем многие из этих аспектов.
Командные оболочки и терминалы бывают разные, хотя по умолчанию в большинстве операционных систем стоит Bash .
Отдельно скажем, что командная оболочка и терминал — не одно и то же. Терминал — это программа, которая запускает командную оболочку внутри себя:
Как вы увидите далее, командная оболочка — это полноценная среда программирования. Многие команды являются стандартными конструкциями любого языка программирования: переменными, циклами или условиями. Кроме того, некоторые команды являются программами, а некоторые — нет. В ближайших уроках для простоты мы будем говорить слово «команда», но потом объясним разницу.
Командную оболочку нередко называют реплом от английского REPL (Read-Eval-Print-Loop). Это сокращение отражает способ взаимодействия командной оболочки с пользователем:
- Read — оболочка ждет ввода команды от пользователя
- Eval — исполняет введенную команду
- Print — выводит результат
- Loop — возвращаемся к первому пункту
Этот процесс называется интерактивной сессией: после загрузки командная оболочка ждет ввода команды, исполняет ее, выводит результат и снова ждет ввода команды. Так происходит до тех пор, пока не будет дана команда на выход из терминала или выключение компьютера.
REPL — широко распространенный способ взаимодействия с пользователем. В следующих курсах вы увидите, что он есть и у баз данных, и у языков программирования.
Чтобы вам было удобнее выполнять задания к урокам, в среде Хекслета сразу запущено два терминала. Терминалы доступны в нижних вкладках под именами Terminal 1 и Terminal 2.
Во время изучения и экспериментов достаточно легко допустить ошибки. Всегда внимательно читайте вывод, в случае паники переоткройте терминал. Это позволит начать все с чистого листа.
Самостоятельная работа
Чтобы научиться работать в командной строке, нужно как можно больше практиковаться в терминале на вашем компьютере.
Сначала нужно установить терминал. Установка зависит от вашей операционной системы:
- Если вы используете Linux или MacOS, в вашей операционной системе уже есть установленный терминал. Можете использовать его или скачать более продвинутую версию — например, iTerm2 для MacOS и Tilix для Linux
- Если вы работаете с ОС Windows, вам потребуется использовать WSL Далее убедитесь, что внутри терминала можно запустить bash-сессию. Откройте терминал и введите такой текст:
echo $SHELL /bin/bash # Это вывод команды, которую вы ввели выше
Дополнительные материалы
![]()
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Unix2017b/Командная оболочка
Командная оболочка UNIX (англ. Unix shell, часто просто «шелл») — командный интерпретатор, используемый в операционных системах семейства Unix, в котором пользователь может либо давать команды операционной системе по отдельности, либо запускать скрипты, состоящие из списка команд.
Обычно пользователь взаимодействует с оболочкой через эмулятор терминала.
- 1 Виды
- 2 История
- 2.1 Thompson shell
- 2.2 Bourne shell
- 2.3 C shell
- 3.1 Оболочки в Ubuntu
- 3.2 Узнать текущую оболочку
- 4.1 Терминалы
- 4.2 Комбинации клавиш
- 4.3 Получение справки
- 4.4 man
- 4.4.1 Разделы справки
- 5.1 Шебанг (shebang)
- 5.2 Переменная окружения PATH
- 5.3 /usr/bin/env
- 5.4 Создание сценариев командной оболочки (шелл-скриптов)
- 6.1 Задача 1
- 6.2 Задача 2
Виды
В первую очередь, под shell понимаются POSIX-совместимые оболочки, восходящие к Bourne shell (шелл Борна).
Условно оболочки можно разделить их на четыре группы:
- Клоны Bourne shell (bash, zsh)
- C shell (csh, tcsh)
- Базирующиеся на популярных языках программирования (psh, ipython, scsh)
- Экзотические, специфические и все остальные
История
Thompson shell
Первая оболочка Unix — Thompson shell, написанная Кеном Томпсоном в Bell Labs (1971–1975). По современным представлениям выглядит неразвитой, но уже поддерживала перенаправления ввода/вывода, метасимволы (wildcards) для имён файлов, простые управляющие выражения с if, goto (но они были сделаны через отдельные программы). Эта оболочка проектировалась под влиянием оболочки Multics, которая, в свою очередь, делалась на базе программы RUNCOM. Это название можно встретить на современных системах в суффиксе «rc» файлов конфигурации (например, .vimrc и .bashrc).
Так, у Томпсона перенаправление выглядело следующим образом:
command1 >command2>
Такой синтаксис был затем заменён на привычный
command1 | command2
Затем появилась оболочка PWB shell (другое название — Mashey shell) (1975–1977). Там появились переменные (предшественники переменных окружения), доступ к ним через $, запуск скриптов, доработаны операторы if/then/else/endif, switch/breaksw/endsw и while/end/break/continue. Но она не стала особо популярной.
Позже появились оболочки Bourne shell и C shell, которые оказали наибольшее влияние на развитие Unix-оболочек.
Bourne shell

Stephen R. Bourne
Оболочка Bourne shell (часто называют sh по имени исполняемого файла) разработана с нуля Стивеном Борном (Stephen R. Bourne). Внедрена в ОС Unix в 1979 г (в седьмую версию ОС). Большая часть операторов была заимствована им из языка ALGOL 68. Например, наследие этого языка: перевёрнутое ключевое слово используется для завершения блока (if — fi, case — esac). Приглашение командной строки отображается в виде доллара $.
Оболочка Борна выполняла две основные задачи:
- служила интерпретатором команд, позволяя выполнять команды в интерактивном режиме;
- позволяла создавать сценарии (скрипты), которые можно было неоднократно вызывать с помощью оболочки.
Новая командная оболочка Bourne again shell (bash) разработана в 1987 году Брайаном Фоксом (Brian Fox) в рамках Free Software Foundation (Столлман). Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.
Подавляющее большинство важных скриптов командного процессора Борна могут выполняться без изменения в bash.
Командная оболочка Z shell (исполняемый файл zsh) — свободная современная sh-совместимая оболочка. Имеет ряд преимуществ перед bash, касающихся в основном работы в интерактивном режиме. Первая версия zsh была написана Паулем Фалстадом (Paul Falstad) в 1990 году.
C shell
Оболочка csh написана Биллом Джоем (Bill Joy) в университете Беркли в рамках проекта по реализации BSD Unix (1979). Билл также известен как автор текстового редактора vi.
За основу для скриптового языка csh был взят, как понятно из названия, язык C. Т.к. на тот момент, в 1978 г., это был наиболее популярный язык программирования среди разработчиков и пользователей BSD UNIX.
В настоящий момент более популярна свободная реализация csh — tcsh, или TENEX C Shell. Именно в tcsh когда-то впервые появилось автодополнение. Является оболочкой по умолчанию в FreeBSD.
#!/bin/sh if [ $days -gt 365 ] then echo This is over a year. fi
#!/bin/csh if ( $days > 365 ) then echo This is over a year. endif
#!/bin/sh i=2 j=1 while [ $j -le 10 ] do echo '2 **' $j = $i i=`expr $i '*' 2` j=`expr $j + 1` done
#!/bin/csh set i = 2 set j = 1 while ( $j = 10 ) echo '2 **' $j = $i @ i *= 2 @ j++ end
Синтаксис csh на первый взгляд может показаться соблазнительным, потому что похож на C, но в общем использовать эту оболочку для написания скриптов не рекомендуется. Не хватает возможностей по работе с потоками (stdout и stderr) и поддержки функций. В самом интерпретаторе csh используется плохой примитивный парсер (в связи с тем, что в 70-е не была развита наука о компиляторах), из-за чего некоторые на вид корректные скрипты не работают так, как ожидается. Сообщения об ошибках парсинга очень неинформативные.
Кроме недостатка функциональности, можно заметить, что количество книг, справочных ресурсов, вопросов на Stackoverflow и пр. для tcsh гораздо меньше, чем для bash.
Современное состояние
Традиционно в Unix-системах шелл Борна называется sh и, согласно FHS, лежит в /bin/sh. На настоящих системах это часто символическая или жёсткая ссылка на один из альтернативных шеллов:
- ash (Almquist shell, оболочка Альмквиста);
- bash (Bourne-again shell, «ещё-одна-командная-оболочка-Борна»);
- dash (Debian Almquist shell);
- ksh (Korn shell);
- zsh (Z shell, современная, имеет ряд преимуществ перед bash касающихся в основном работы в интерактивном режиме);
- BusyBox — современная микро-версия, предназначенные для встраиваемых систем;
- .
Стандарт POSIX специфицирует стандартную оболочку как строгое подмножество Korn shell, расширенной версии оригинальной Bourne shell.
Bash — одна из наиболее популярных современных разновидностей командной оболочки. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки.
Оболочки в Ubuntu
Начиная с версии Ubuntu 6.10 (октябрь 2006 г.), ссылка /bin/sh изменена с bash на dash. Это привело к неработоспособности многочисленных скриптов.
bash остаётся оболочкой для входа в систему по умолчанию.
Главная причина — эффективность. Оболочка dash более легковесна, при загрузке ОС выполняется большое количество скриптов, в которых возможности bash избыточны.
sobols@sobols-VirtualBox:~$ ls /bin/*sh -l -rwxr-xr-x 1 root root 1017016 Крс 24 2014 /bin/bash -rwxr-xr-x 1 root root 121272 Лют 19 2014 /bin/dash lrwxrwxrwx 1 root root 4 Врс 19 2014 /bin/rbash -> bash lrwxrwxrwx 1 root root 9 Врс 14 09:36 /bin/sh -> /bin/dash lrwxrwxrwx 1 root root 7 Врс 19 2014 /bin/static-sh -> busybox
Узнать текущую оболочку
echo $0 echo $SHELL
Работа в интерактивном режиме
Терминалы
Ядра UNIX-систем имеют общее понятие терминалов. Терминал предоставляет возможность приложениям отображать выходные данные и принимать входные данные через терминальное устройство. Процесс может иметь управляющий терминал — для приложения с текстовым режимом, так он взаимодействует с пользователем.
Терминалы могут быть:
- аппаратными терминалами («tty», от «телетайп»),
- псевдотерминалами («pty»).
Аппаратные терминалы подключаются через некоторый интерфейс, такой как последовательный порт (ttyS0, . ) или USB (ttyUSB0, . ), или через экран ПК и клавиатуру (tty1, . ). Псевдотерминалы предоставляются терминальным эмулятором, который является приложением. Файлы в каталоге /dev/pts являются псевдотерминалами.
Некоторые типы псевдотерминалов:
- Приложения GUI, такие как xterm, gnome-terminal, konsole, . преобразуют клавиатуру и события мыши в текстовый ввод и вывод изображения графически некоторым шрифтом.
- Мультиплексорные приложения, такие как screen и tmux, передают ввод и вывод на другой терминал, чтобы отделить приложения от фактического терминала.
- Удаленные приложения оболочки, такие как sshd, telnetd, rlogind, . передают ввод и вывод между удалённым терминалом на клиенте и pty на сервере.
Если программа открывает терминал для записи, вывод из этой программы появляется на терминале. Обычно бывает, что одновременно выводится несколько программ на терминал, хотя иногда это может сбивать с толку, так как невозможно определить, какая часть выхода поступает из какой программы.
Если программа открывает терминал для чтения, ввод от пользователя передается этой программе. Если несколько программ читают с одного и того же терминала, каждый символ направляется независимо к одной из программ; это не рекомендуется. Обычно есть только одна программа, активно читающая с терминала в данный момент времени.
Чтобы поэкспериментировать, запустите команду tty в терминале, чтобы узнать, какое терминальное устройство используется. Скажем, это /dev/pts/42. В шелле в другом терминале запустите echo
echo hello> /dev/pts/42
Приветствие hello будет отображаться на другом терминале. Теперь запустите
cat /dev/pts/42
и введите в другой терминал. Чтобы убить эту команду, нажмите Ctrl+C.
Запись на другой терминал иногда бывает полезной для отображения уведомления; например, команда write делает это. Чтение с другого терминала обычно не выполняется, потому что не требуется.
При нажатии клавиш Ctrl+Alt+F1, Ctrl+Alt+F2, из графической оболочки Linux-дистрибутива можно попасть в текстовый режим в терминалы tty1, tty2, . Для возврата обратно в графический режим обычно можно нажать Ctrl+Alt+F7.
Комбинации клавиш
При работе в bash действуют полезные горячие клавиши.
- Tab — автодополнение.
- Стрелки вверх-вниз (также Ctrl+P и Ctrl+N) — история команд.
- Home и End (также Ctrl+A и Ctrl+E) — переход в начало/конец строки.
- Alt+B и Alt+F (также Ctrl и стрелки влево-вправо) — переход по словам назад/вперёд.
- Ctrl+L — очистить экран.
- Ctrl+R — поиск по истории.
Получение справки
man
man (от англ. manual — руководство) — команда UNIX, предназначенная для форматирования и вывода справочных страниц. Поставляется почти со всеми UNIX-подобными дистрибутивами. Каждая страница справки является самостоятельным документом и пишется разработчиками соответствующего программного обеспечения.
Чтобы вывести справочное руководство по какой-либо команде (или программе, предусматривающей возможность запуска из терминала), можно в консоли ввести:
man command_nameНапример, чтобы посмотреть справку по команде ls, нужно ввести man ls.
Для навигации в справочной системе man можно использовать клавиши ↑ и ↓ для построчного перехода, PgUp и PgDn для постраничного перехода вверх и вниз соответственно.
При просмотре больших страниц удобно воспользоваться поиском, для чего следует нажать /, затем набрать строку поиска (и слеш, и строка поиска отобразятся в нижней части экрана) и нажать Enter. Обратным поиском (снизу вверх) можно воспользоваться, нажав кнопку ?. При этом подсветятся все совпадения с заданным регулярным выражением, и экран прокрутится до первого из них. Для перехода к следующему подсвеченному вхождению нужно нажать n (Next — следующий), либо оставить строку поиска пустой (/, затем Enter). Для показа предыдущего совпадения надо также использовать вопросительный знак или же нажимать N (заглавную).
Для получения краткой справки по командам и горячим клавишам справочной системы нужно нажать H (Help — помощь).
Для выхода из справочной системы используется клавиша Q (Quit — выход).
Для получения детальной инструкции по использованию команды используется конструкция
man man
Разделы справки
Раздел Краткое описание 1 Прикладные программы и команды оболочки 2 Системные вызовы ядра (функции языка C) 3 Библиотечные вызовы (функции различных библиотек, установленных в систему) 4 Специальные файлы (находящиеся обычно в каталоге /dev) 5 Форматы файлов и соглашения 6 Игры 7 Различные описания, соглашения и прочее 8 Команды администрирования системы, которые обычно запускаются от имени суперпользователя 9 Ядро операционной системы (нестандартный раздел) Номер раздела в команде man указывается вторым аргументом, перед названием справочной страницы. Если номер раздела опущен, то поиск справочной страницы ведётся по всем разделам по порядку.
man passwd #раздел 1 man 1 passwd #раздел 1 man 5 passwd #раздел 5
info
Альтернатива для man от проекта GNU.
Запуск программ
- бинарные исполняемые файлы (в формате ELF и пр.);
- текстовые программы (скрипты) на интерпретируемых языках.
И те, и те файлы в UNIX-системах имеют выставленные биты права на выполнение. Право на выполнение (x) означает, что вы можете загрузить файл в память и попытаться запустить его на выполнение как исполняемую программу. Загрузчик по первым байтам понимает, как запускать этот исполняемый файл.
Шебанг (shebang)
Последовательность из двух символов: решётки и восклицательного знака (#!) в начале файла скрипта.
Когда скрипт с шебангом выполняется как программа в UNIX-подобных операционных системах, загрузчик программ рассматривает остаток строки после шебанга как имя файла программы-интерпретатора. Загрузчик запускает эту программу и передаёт ей в качестве параметра имя файла скрипта с шебангом.
#!interpreter [optional-arg]
interpreter должен быть абсолютным путём.
Пример: в файле some/path/to/foo записано
#!/bin/sh -x
и он запускается как
some/path/to/foo bar baz
Это то же самое, что запустить
/bin/sh -x some/path/to/foo bar baz
Вопрос: что будет, если запустить
#!/bin/cat Hello world!
Ответ: напечатаются обе строки.
Переменная окружения PATH
Переменная окружения PATH представляет собой набор каталогов, в которых расположены исполняемые файлы. В основном, каждый выполняемый процесс или сеанс пользователя имеет собственную переменную PATH.
На POSIX и Unix-подобных операционных системах переменная PATH задана как одно или несколько имён каталогов, разделённых двоеточиями (:).
echo $PATH
Согласно стандарту POSIX, использовать каталоги с двоеточием в имени не получится.
Since is a separator in this context, directory names that might be used in PATH should not include a character.
В основном в переменную PATH входят каталоги /bin, /usr/bin и /usr/local/bin.
Текущий каталог (.) обычно в PATH не входит из соображений безопасности, чтобы избежать случайного исполнения скриптов из текущего каталога. Запуск такой программы требует написания (./) перед названием.
После создания запроса запуска пользователем или программой, система будет проверять каждый каталог переменной $PATH слева направо в поисках файла, соответствующего заданной команде. Первая найденная программа выполняется в качестве дочернего процесса командной оболочки или программы, сделавшей запрос.
/usr/bin/env
Для переносимости, чтобы не указывать полный путь к интерпретатору, в шебанг прописывают программу /usr/bin/env. Например,
/usr/bin/env python
запустит первый python, который будет найден в PATH.
Пусть есть следующий скрипт на Python:
#!/usr/bin/env python import sys print sys.executable
sobols@sobols-VirtualBox:~/unix/path$ ./main.py /usr/bin/python sobols@sobols-VirtualBox:~/unix/path$ virtualenv venv Running virtualenv with interpreter /usr/bin/python2 New python executable in /home/sobols/unix/path/venv/bin/python2 Also creating executable in /home/sobols/unix/path/venv/bin/python Installing setuptools, pkg_resources, pip, wheel. done. sobols@sobols-VirtualBox:~/unix/path$ source ./venv/bin/activate (venv) sobols@sobols-VirtualBox:~/unix/path$ ./main.py /home/sobols/unix/path/venv/bin/python
Создание сценариев командной оболочки (шелл-скриптов)
Сценарий представляет собой обычный текстовый файл, редактируемый в текстовом редакторе. Можно выбрать по вкусу
- nano / mcedit (mc F4) / evim
- gedit
- Sublime Text
- .
Расширение файла значения не имеет. Часто используется .sh.
chmod +x script.sh
Практические задания
Задача 1
Любым способом создайте файл, в имени которого присутствует перевод строки. Проверьте, как выводит такое имя команда ls.
Задача 2
Переименуйте файл file.txt в -file-.txt.

