Командные оболочки появились в самом начале развития Unix, они были необходимы, поскольку это был единственный способ взаимодействия с системой. За это время они прошли очень долгий путь развития и получили много новых функций. Не так просто оценить эволюцию командных оболочек Linux. Об этом можно писать очень долго и одной статьи точно не хватит. Мы постараемся только охватить самое основное не погружаясь очень глубоко. Давайте сначала рассмотрим что такое командная оболочка Linux и какие оболочки бывают.
Unix оболочка - это интерпретатор командной строки, который выполняет команды, вводимые пользователем. Мы вводим команду, она интерпретируется, выполняется а затем мы получаем результат ее выполнения. Оболочка обеспечивает традиционный интерфейс ввода команд Unix, к которому мы привыкли. Это, как правило, черный экран и белый текст. Мы вводим команды в виде обычного текста, а также можем создавать скрипты из одной или нескольких команд.
Оболочка - это ваш интерфейс взаимодействия с системой. После входа в систему Unix, вы оказываетесь в программе, которая называется оболочка.
Если верить истории и многим-интернет источникам, то самой первой оболочкой была Thompson Shell, написанная Кеном Томсоном в Bell Labs. Всего было 6 версий и распространялась она с 1971 по 1975 год. Поддерживались такие функции, как: перенаправление ввода / вывода и простые управляющие конструкции - if, goto. Эти функции поддерживают все современные командные оболочки в линукс.
Оболочка PWB - это модификация оболочки Томсона разработанная Джоном Машеу. Она была написана для увеличения удобства Shell программирования. Появились такие интересные структуры, как if-then-else-endif, switch и циклы while.
Свой подъем Unix начал с оболочкой Борна. Она была написана Стефаном Борном в Bell Labs и использовалась как оболочка по умолчанию в Unix версии 7 от 1979 года. Здесь уже было реализовано большое количество возможностей доступных в современных оболочках - дополнение имен файлов, автодополнение команд, стандартные переменные окружения и встроенные управляющие структуры. Bourne Shell называлась sh и размещалась в файловой системе Unix по адресу /bin/sh.
Во многих системах программа оболочки Борна (sh) - это символическая или жесткая ссылка на одну из ее альтернатив:
Пример скрипта для Bourne Shell:
!/bin/sh
echo "Hello World 1!"
echo "Hello World 2!"
Almquist shell, еще известная как A Shell. Это легкая оболочка Unix первоначально написанная Кеннетом Альмквистом. Она была разработана в конце 1980х. Это модификация оболочки Борна и она заменила оригинал в BSD Unix выпущенной в 1990 году. Сейчас ее можно использовать в таких дистрибутивах, как Debian и Ubuntu в виде версии ash под названием dash (Debian Almquist shell) Также эта оболочка популярна на встраиваемых Unix дистрибутивах.
Это быстрая, компактная и совместимая со спецификациями стандарта POSTIX оболочка Unux, и может быть именно поэтому она часто используется на встраиваемых устройствах. Но ash не поддерживает истории команд. Хотя в современных версиях эта функция уже добавлена.
Написанная Браеном Фоксом в рамках проекта GNU как бесплатная и свободная замена для оболочки Борна. Bash -наиболее популярная и широко используемая из всех оболочек. Все дистрибутивы Linux поставляются по умолчанию с этой оболочкой. Она расширяет набор функций Bourne Shell. В большинстве систем Unix / Linux эта оболочка может быть найдена в файловой системе по адресу /bin/bash. Она была выпущена в 1989 году.
Благодаря такой популярности она была портирована на Windows и распространяется вместе с набором компиляторов Cygwin и MinGW. Также Bash используется в Android, для доступа к ней можно использовать различные эмуляторы терминала.
Здесь поддерживается автодополнение, перенаправление ввода / вывода, дополнение команд, переменные и управляющие структуры для принятия решения (if-then-elese if) и циклы (loop).
Bash скрипты начинаются с такой строки:
Эта командная оболочка linux также поддерживает чтение команд из файла и перенаправление вывода в файл или другую команду.
Пример кода на Bash:
!/bin/sh
if [ $days -gt 365 ]
then
echo This is over a year.
fi
Написана Девидом Кроном и основана на исходниках оболочки Борна. KornShell (ksh) это оболочка, разработанная в Bell Labs еще в 1980. Она имеет обратную совместимость с Bourne Shell, а также включает многие черты оболочки С.
Есть следующие версии и модификации:
Пример скрипта:
!/bin/ksh
print Disk space usage
du -k
exit 0
Пол Фальстад написал первую версию командой оболочки zsh в 1990 году. Это командная оболочка Linux, которая может быть использована как интерактивная оболочка входа в систему, очень мощный интерпретатор команд. На самом деле Zsh это расширенная оболочка Борна с большим количеством улучшений, которая включает некоторые функции из Bash, KSH и Tcsh.
Имя Zsh происходит от имени Йельского профессора Чжун Шао (Zhong Shao) так как Пол был студентом Принстонского университета.
Поддерживаются такие интересные функции:
Оболочка C также известна как Csh. Ее разработал Бил Джой когда был студентом Калифорнийского университета. Эта оболочка очень распространена в системах BSD Linux. Здесь есть много интересных особенностей, в том числе контрольные структуры и грамматические выражения. Эта оболочка также впервые представила большое количество интересных функций, таких как история и механизмы редактирования, псевдонимы, CDPATH, управление задачами и хеширование, перенаправление вывода, присоединение, замена переменных, выполнение в фоне и т д.
Как и другие виды командных оболочек Linux здесь поддерживаются файлы скриптов, перенаправление и управляющие структуры. Csh сейчас используется в виде tcsh во многих системах, например, MacOS X и Red Hat Linux. В Debian можно использовать оба варианта CSH и Tcsh.
Пример кода на C Shell:
!/bin/csh
if ($days > 365) then
echo This is over a year.
endif
Fish или Friendly Interactive Shell - это командная оболочка Linux нового поколения. Она разработана чтобы облегчить пользователю выполнение команд, есть подсветка синтаксиса, подсветка правильных адресов файлов, быстрый поиск по истории, веб-конфигуратор, а также особый синтаксис скриптов.
Это новая командная оболочка в Linux и ее синтаксис непохож ни на одну из современных командных оболочек, а скорее на язык программирования Python.
Пример создания функции на fish:
!/usr/bin/fish
funced su
function su
/bin/su --shell=/usr/bin/fish $argv
end
funcsave su
Более подробное сравнение командных оболочек в Linux вы можете посмотреть по ссылке .
Это все на сегодня. Надеюсь вам было интересно.
Здесь не будет пересказа манов (документации), и статья никак не отменяет и не заменяет их чтение. Вместо этого я расскажу о главных вещах (командах, приемах и принципах), которые надо осознать с самого начала работы в unix shell-е, чтобы работа происходила эффективно и приятно.
Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ.
В целом работа через шелл выглядит так: пользователь (т.е. вы) с клавиатуры вводит команду, нажимает Enter, система выполняет команду, пишет на экран результат выполнения, и снова ожидает ввода следующей команды.
Типичный вид шелла:
Шелл - это основной способ для взаимодействия со всеми Unix-подобными серверными системами.
Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.
На MacOS - тоже запустить Terminal.
Для доступа к удаленному серверу - воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows).
Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter - команда выполнится еще раз.
Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после - нет). Нажмите Enter - выполнится модифицированная команда.
Пролистывание истории, редактирование и повторное выполнение команд - самые типичные действия при работе в командной строке, привыкайте.
Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки.
Попробуйте выполнить команду date +"%y-%m-%d, %A"
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.
После того, как научитесь пользоваться man "ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу).
Как именно копировать текст из терминала и вставлять его в терминал - зависит от вашей системы и от ее настроек, поэтому дать универсальную инструкцию, к сожалению, не получится. На Ubuntu попробуйте так: копирование - просто выделение мышью, вставка - средняя кнопка мыши. Если не работает, или если у вас другая система - поищите в Интернете или спросите более опытных знакомых.
Akira@latitude-e7240:
~/shell-survival-quide> ls
Makefile shell-first-steps.md shell-first-steps.pdf
shell-survival-quide.md shell-survival-quide.pdf
Если же добавить ключ -l , к каждому файлу выводится подробная информация:
Akira@latitude-e7240:
~/shell-survival-quide> ls -l
total 332
-rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile
-rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md
-rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf
-rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md
-rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f .
Кроме того, команды могут принимать в качестве параметров имена файлов, каталогов или просто текстовые строки. Попробуйте:
Ls -ld /home ls -l /home grep root /etc/passwd
Попробуйте: man grep , man atoi , man chdir , man man .
Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки - кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n .
Все справочные статьи делятся на категории. Самые важные:
Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка - тоже часть комады).
Попробуйте и сравните поведение:
Cat /etc/bash.bashrc cat /etc/bash.bashrc |less
Можно передать файл в пролистыватель сразу в параметрах:
Less /etc/bash.bashrc
Пролистывание вверхи и вниз - кнопки «вверх», «вниз», «PageUp», «PageDown», выход - кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .)
Посмотреть права на файл можно с помощью ls -l . Например:
> ls -l Makefile
-rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) - только читать, всем прочим пользователя - тоже только читать.
Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать.
Подробнее читайте в man chmod .
Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:
> wc
good day today
good day
2 5 24
В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.
Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так:
> head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.
Можно представить себе так: программа - это труба, в которую втекает STDIN , а вытекает STDOUT .
Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе.
Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски - конвейер или пайп.
Объединение программ в конвейер делается символом | (вертикальная черта)
Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее:
> head -n3 /etc/passwd |wc
3 3 117
Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.
В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc:
> head -n3 /etc/passwd |wc |wc 1 3 24
Составление конвейеров (пайпов) - очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».
Date > /tmp/today.txt
В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt
Если файл с таким именем уже существовал, его старое содержимое будет уничтожено. Если файл не существовал, он будет создан. Каталог, в котором создается файл, должен существовать до выполнения команды.
Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> :
Date >> /tmp/today.txt
Проверьте, что теперь записано в файле.
Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте:
Wc
Если вы разобрались со сложной проблемой (самостоятельно, с помощью Интернета или других людей) -- запишите свое решение на случай, если такая же проблема снова возникнет у вас или ваших товарищей. Записывать можно в простой текстовый файл, в Evernote, публиковать в соц.сетях.
Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить .См. также раздел «Составление конвейера-однострочника».
Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям (root "у).
Шаг 1.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе:
ps axuww . Запустить.
Шаг 2.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.
Ps axuww |grep `whoami`
- только процессы текущего пользователя.
Шаг 3.
Повторять пункт 2, пока не получатся чистые нужные данные.
- все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),
Ps axuww |grep `whoami` | grep "\
- только процессы с нужным именем
Ps axuww |grep `whoami` | grep "\
Pid-ы нужных процессов, п. 3 выполнен
Шаг 4.
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:
Вот некоторые программы, которые определенно вам пригодятся, если вы будете жить в командной строке:
Здесь не будет пересказа манов (документации), и статья никак не отменяет и не заменяет их чтение. Вместо этого я расскажу о главных вещах (командах, приемах и принципах), которые надо осознать с самого начала работы в unix shell-е, чтобы работа происходила эффективно и приятно.
Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ.
В целом работа через шелл выглядит так: пользователь (т.е. вы) с клавиатуры вводит команду, нажимает Enter, система выполняет команду, пишет на экран результат выполнения, и снова ожидает ввода следующей команды.
Типичный вид шелла:
Шелл - это основной способ для взаимодействия со всеми Unix-подобными серверными системами.
Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.
На MacOS - тоже запустить Terminal.
Для доступа к удаленному серверу - воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows).
Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter - команда выполнится еще раз.
Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после - нет). Нажмите Enter - выполнится модифицированная команда.
Пролистывание истории, редактирование и повторное выполнение команд - самые типичные действия при работе в командной строке, привыкайте.
Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки.
Попробуйте выполнить команду date +"%y-%m-%d, %A"
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.
После того, как научитесь пользоваться man "ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу).
Как именно копировать текст из терминала и вставлять его в терминал - зависит от вашей системы и от ее настроек, поэтому дать универсальную инструкцию, к сожалению, не получится. На Ubuntu попробуйте так: копирование - просто выделение мышью, вставка - средняя кнопка мыши. Если не работает, или если у вас другая система - поищите в Интернете или спросите более опытных знакомых.
Akira@latitude-e7240:
~/shell-survival-quide> ls
Makefile shell-first-steps.md shell-first-steps.pdf
shell-survival-quide.md shell-survival-quide.pdf
Если же добавить ключ -l , к каждому файлу выводится подробная информация:
Akira@latitude-e7240:
~/shell-survival-quide> ls -l
total 332
-rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile
-rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md
-rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf
-rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md
-rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f .
Кроме того, команды могут принимать в качестве параметров имена файлов, каталогов или просто текстовые строки. Попробуйте:
Ls -ld /home ls -l /home grep root /etc/passwd
Попробуйте: man grep , man atoi , man chdir , man man .
Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки - кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n .
Все справочные статьи делятся на категории. Самые важные:
Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка - тоже часть комады).
Попробуйте и сравните поведение:
Cat /etc/bash.bashrc cat /etc/bash.bashrc |less
Можно передать файл в пролистыватель сразу в параметрах:
Less /etc/bash.bashrc
Пролистывание вверхи и вниз - кнопки «вверх», «вниз», «PageUp», «PageDown», выход - кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .)
Посмотреть права на файл можно с помощью ls -l . Например:
> ls -l Makefile
-rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) - только читать, всем прочим пользователя - тоже только читать.
Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать.
Подробнее читайте в man chmod .
Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:
> wc
good day today
good day
2 5 24
В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.
Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так:
> head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.
Можно представить себе так: программа - это труба, в которую втекает STDIN , а вытекает STDOUT .
Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе.
Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски - конвейер или пайп.
Объединение программ в конвейер делается символом | (вертикальная черта)
Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее:
> head -n3 /etc/passwd |wc
3 3 117
Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.
В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc:
> head -n3 /etc/passwd |wc |wc 1 3 24
Составление конвейеров (пайпов) - очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».
Date > /tmp/today.txt
В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt
Если файл с таким именем уже существовал, его старое содержимое будет уничтожено. Если файл не существовал, он будет создан. Каталог, в котором создается файл, должен существовать до выполнения команды.
Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> :
Date >> /tmp/today.txt
Проверьте, что теперь записано в файле.
Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте:
Wc
Если вы разобрались со сложной проблемой (самостоятельно, с помощью Интернета или других людей) -- запишите свое решение на случай, если такая же проблема снова возникнет у вас или ваших товарищей. Записывать можно в простой текстовый файл, в Evernote, публиковать в соц.сетях.
Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить .См. также раздел «Составление конвейера-однострочника».
Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям (root "у).
Шаг 1.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе:
ps axuww . Запустить.
Шаг 2.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.
Ps axuww |grep `whoami`
- только процессы текущего пользователя.
Шаг 3.
Повторять пункт 2, пока не получатся чистые нужные данные.
- все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),
Ps axuww |grep `whoami` | grep "\
- только процессы с нужным именем
Ps axuww |grep `whoami` | grep "\
Pid-ы нужных процессов, п. 3 выполнен
Шаг 4.
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:
Вот некоторые программы, которые определенно вам пригодятся, если вы будете жить в командной строке:
В данном разделе предоставлена документация в помощь программисту на языках командных оболочек shell (sh, bash, ksh и другие)
0. Введение
Командный интерпретатор в среде UNIX выполняет две основные функции:
представляет интерактивный интерфейс с пользователем, т.е. выдает приглашение, и обрабатывает вводимые пользователем команды;
обрабатывает и исполняет текстовые файлы, содержащие команды интерпретатора (командные файлы);
В последнем случае, операционная система позволяет рассматривать командные файлы как разновидность исполняемых файлов. Соответственно различают два режима работы интерпретатора: интерактивный и командный.
В среде UNIX (в отличие, скажем, от DOS) имеются несколько различных командных интерпретаторов. Перечислим наиболее популярные:
/bin/sh - Bourne shell. Исторически это первая командная оболочка, разработанная для первой версии ОС UNIX. В настоящее время эта оболочка является основной в версиях UNIX System V.
/bin/csh - С-shell. Оболочка, синтаксис командного языка которой приближен к языку C. Является основной оболочкой для Берклеевской разновидности ОС UNIX.
/bin/ksh - k-shell.
/bin/rsh - Restricted shell. Представляет собой sh с ограниченными возможностями (прежде всего для защиты ОС от несанкционированных действий пользователя).
Операционная система ConvexOS является разновидностью 4.3 BSD UNIX()BSD - Berkeley Series Distribution и, следовательно, базовой командной оболочкой является csh.
1. Основные возможности
Работа с командной строкой
Набираемую пользователем строку интерпретатор воспринимает как команду (или несколько команд). Синтаксис командного интерпретатора позволяет набирать
несколько команд в одной строке, разделяя их точкой с запятой. Например
эквивалентно двум последовательно введенным командам:
Наоборот, при желании пользователь может
продолжить набор длинной команды на следующей строке, закончив текущую строку знаком \\. До завершения ввода команды вы будете получать ``вторичное приглашение"" > вместо основного (%). Например,
% tar tv Makefile star.o star.c star.dat main.o main.c
эквивалентно
% tar tv Makefile star.o \
> star.c star.dat \
Управление потоками ввода-вывода осуществляется, подобно DOS(Точнее, синтаксис перенаправления потоков ОС DOS восприняла от UNIX) с помощью символов > , > > ,
Полезный частный случай использования механизма перенаправления потоков - перенаправление в /dev/null, что позволяет избавиться от ненужных сообщений на экран. С помощью того же механизма можно создавать пустые файлы:
создаст в текущей директории пустой файл myfile.
Дополнительно C-shell позволяет группировать команды с помощью круглых скобок. В этом случае вся конструкция внутри скобок рассматривается интерпретатором как одна команда. Сие полезно, например, в таких конструкциях:
% (command1 | command2)
Если же скобки опустить, shell не сможет определить какой из команд вы хотите подать на вход файл myfile.
Следующие ``удобства"" существуют в данной реализации C-shell:
Вы можете не набирать длинную команду до конца, а попробовать после частичного набора команды (или имени файла) нажать клавишу табуляции. C-shell попытается сама дополнить недостающие символы, либо ответит писком, если выбор неоднозначен.
Если вы набрали команду, но забыли ее опции, наберите последовательность H. C-shell выдаст краткую помощь. Например,
Набирая полное имя файла пользуйтесь комбинацией клавиш ^D. Вы сможете получить листинг набираемого каталога в формате команды lf.
Командный буфер запоминает 20 последних команд. Вместо набора команды вы можете вызвать ее из буфера с помощью стрелочной клавиатуры (конечно только в том случае, если эта команда есть в буфере).
Разбор командной строки
Интерпретатор, получив командную строку, выполняет над ней ряд преобразований, а именно:
Раскрывает псевдонимы (alias)
Раскрывает метасимволы (*, ?, [, ], ~, {, })
Подставляет переменные shell
Выполняет команду, если она - встроенная команда интерпретатора, или запускает процесс, если команда внешняя.
Разберем эти действия по этапам.
Псевдонимы (alias). Встроенная команда alias позволяет определять псевдонимы команд. Пример:
% alias mycat "cat | more"
определяет mycat как псевдоним строки cat | more. Поэтому далее вы вправе пользоваться командой mycat, которая будет раскрыта интерпретатором везде, где вы ее используйте. Это - способ определения коротких имен для длинных составных команд.
Встроенная команда unalias mycat уничтожает ранее введенный псевдоним mycat.
Метасимволы. Метасимволы позволяют кратко записывать целые списки слов (главным образом - имен файлов). Shell рассматривает слово, в котором встречаются метасимволы, как шаблон для составления списка имен файлов:
* в шаблоне заменяет любую последовательность символов. Например m* раскроется в список всех файлов, начинающихся с буквы m. Существует небольшое исключение из этого правила: просто * опускает в списке те файлы, имена которых начинаются с точки.
? заменяет один символов. Например m? раскроется в список всех имен файлов, начинающихся с буквы m и состоящих точно из двух букв.
[.-.] позволяет указать интервал для подставляемого символа. Например m будет раскрыто в ma mb mc me.
{...,...} позволяет перечислить слова для подстановки. Так, например m{red,blue,green} будет раскрыто в mred mblue mgreen.
Наконец, тильда позволяет указать домашний каталог пользователя:
~name/ эквивалентно указанию полного пути в домашний каталог пользователя name (Скажем, /usr1/name/)
~/ эквивалентно указанию полного пути в ваш собственный домашний каталог.
Переменные shell. Слова, начинающиеся с символа $ командный интерпретатор воспринимает как имена переменных. Переменные делятся на переменные окружения (они будут известны всем вызванным из этой shell программам и являются в этом смысле глобальными) и простые переменные.
Встроенная команда set name=value позволяет определить простую переменную с именем name и дать ей значение value. Встретив в командной строке выражение $name интерпретатор заменит его на value. Например,
% set color=blue
выдаст на терминал строчку blue. А
% set color=blue
% echo new$color
даст newblue. Наконец, введя
% set color=blue
% echo ${color}new
получим colornew. Последний пример демонстрирует как надо использовать фигурные скобки для выделения имени переменной из слова (на echo $colornew интерпретатор бы ответил, что переменная colornew не определена.
Команда unset уничтожает ранее определенные переменные.
Чтобы определить переменную равной строке из нескольких слов, заключите ее в простые кавычки. Пример
% set color="blue or red or green"
Простые переменные могут быть массивами слов (что надо отличать от только что рассмотренного случая, когда переменная содержит строку из нескольких слов. Для объявления массива надо использовать круглые скобки:
% set colors=(blue red green)
Теперь команда echo $colors выдаст строку из трех цветов (попробуйте!). Однако вы можете также работать в отдельными элементами массива (элементы нумеруются с нулевого значения), например так:
(получим green). Количество элементов в массиве содержится в переменной $#colors.
даст на терминал цифру 3.
Возможны довольно сложные комбинации с использованием шаблонов, например:
% set files=(m*)
выдаст число файлов в текущем каталоге, начинающихся с буквы m.
Переменные окружения вызываются точно также как и простые переменные. Разница заключается в способе их определения:
Команда % setenv name value устанавливает переменную окружения с именем name. Обратите внимание на раздражающую разницу в синтаксисе: определяя переменную окружения не надо ставить знак =.
Список всех переменных окружения можно получить с помощью встроенной команды printenv.
Отменить определения переменной окружения можно с помощью unsetenv.
Наконец, для определения массива переменных окружения НЕ используются круглые скобки, а используются двоеточия в качестве разделителей элементов массива:
% setenv MANPATH /usr/man/:/usr/local/man:/usr/man/X11:~/man
Встроенные команды и переменные
Список важнейших встроенных команд C-shell с краткими пояснениями:
alias определяет псевдоним
bg переводит задачу в фоновый режим исполнения
chdir path команда перехода в каталог path.
echo выводит на стандартный вывод все свои аргументы
exec filename запускает процесс из файла filename вместо текущей shell (т.е. поверх нее). Возврат в shell невозможен.
exit заканчивает работу shell.
fg переводит фоновый процесс в синхронный.
file filename выдает информацию о том, что операционная система думает об этом файле.
goto label осуществляет безусловный переход на строку командного файла, помеченную меткой label. Не используется в интерактивном режиме.
kill pid посылает сигнал аварийного завершения процессу с номером pid, что обычно приводит к уничтожению процесса.
source filename считывает и исполняет команды из файла filename.
set, setenv установка внутренних переменных и переменных окружения.
shift var сдвигает элементы массива var влево. При этом размер массива уменьшается на единицу, а нулевой элемент массива теряется. Переменная var должна быть массивом.
time command выполняет команду command и выводит на терминал затраченное на ее выполнение время.
unset уничтожает переменную shell.
unalias уничтожает ранее определенный псевдоним команды.
@ name=expr заносит результат арифметического выражения expr в переменную name.
Список важнейших встроенных переменных C-shell с краткими пояснениями:
argv массив параметров командной строки (используется в командном режиме)
cdpath каталог, куда shell переходит, получив команду chdir без аргумента.
history размер буфера для запоминания команд.
home домашний каталог пользователя
mail местоположение в файловой системе почтового ящика пользователя.
path путь поиска внешних команд.
prompt основное приглашение shell.
prompt1 вторичное приглашение.
shell полный путь исполняемого файла текущей оболочки (/bin/csh)
Управляющие операторы и операторы цикла
Из списка встроенных команд оболочки мы сознательно исключили условные операторы и операторы цикла, которые будут рассмотрены здесь.
Условное выполнение
Синтаксис условного оператора if в C-shell таков
if (expr) command
В качестве expr может стоять либо арифметическое выражение, либо проверка атрибутов файла. Пример:
if (-f /etc/hosts) cat /etc/hosts
Рассмотрим последний случай подробнее. Возможны следующие проверки атрибутов файла:
R доступен на чтение
W доступен на запись
X доступен на исполнение
E проверка существования файла
O проверка что вы являетесь хозяином данного файла
Z файл имеет нулевой размер
F файл является обычным файлом
P файл является именованным программным каналом
D файл является директорией
Цикл while
Цикл выполняется до тех пор, пока условие истинно. Пример:
while ($#files > 0)
Цикл foreach
Это чрезвычайно полезный оператор, позволяющий организовать цикл по элементам массива слов
foreach varname (list)
Тело цикла выполняется столько раз, сколько элементов в массиве list. При этом переменная varname содержит очередное значение элемента массива. Пример
foreach color (blue red green)
echo The color is $color
foreach file (*.for)
echo Renaming $file
mv $file `basename $file .for`.f
Здесь использована стандартная команда basename, которая ``отрезает"" у слова, заданного в первом аргументе суффикс, заданный вторым аргументом и выводит получившееся слово на стандартный вывод. Об использовании обратных кавычек в языке C-shell будет рассказано несколько позже.
Многовариантный условный оператор
Синтаксис условного оператора switch в C-shell таков
case pattern1: ... breaksw case {\it pattern2} :
Оператор позволяет передавать управление в зависимости от того, удовлетворяет ли строка string какому-либо шаблону из набора pattern1, pattern2, ...(в этом случае управление передается в блок, ограниченный case ... breaksw) или нет (в этом случае управление передается на ветвь default:... endsw. В целом, оператор switch очень похож на аналогичный опреатор языка C. Такие конструкции часто используются в командных файлах для анализа ответа пользователя на заданный вопрос ().
2. Работа оболочки в командном режиме
Уже отмечалось, что csh может быть запущена в командном режиме. Более того, условные операторы и операторы цикла чаще используются именно в командных файлах. Здесь мы рассмотрим особенности такой ``командной"" работы.
Идентификация интерпретатора
Проще всего осуществить запуск оболочки в режиме исполнения некоторого файла mycommand придав этому файлу атрибут исполняемости командой chmod:
% chmod +x mycommand
Теперь достаточно ввести с клавиатуры команду mycommand и ОС автоматически запустит shell в командном режиме исполнения данного файла. В таком пути есть один подводный камень: командных интерпретаторов в системе много и синтаксис команд у них разный. Как ОС определит нужный вам? Ответ - никак. Вы должны явно указать ОС какой интерпретатор вы хотите запускать для исполнения данного командного файла. Для этого первая строчка вашего файла должна иметь следующий стандартный вид:
что и позволит ОС правильно поступить. Если же вы не задали этой информации, то ОС будет считать (по историческим причинам), что файл написан на языке Bourne shell и вы вероятнее всего получите множество сообщений о синтаксических ошибках.
Заметим еще одно полезное свойство работы оболочки в командном режиме: все строки, начинающиеся со знака # будут проигнорированы. Это позволяет вносить в текст командного файла комментарии.
Следующий факт позволяет вам работать с командной строкой средствами csh: при запуске командного файла mycommand автоматически становится определенной внутренняя переменная с именем argv, представляющая массив параметров командной строки. Например, следующий командный файл просто выводит все свои аргументы и их количество на терминал:
# This file simply outputs its arguments
# and the total number of arguments
echo Arguments: $argv
echo Number of arguments: $#argv
Явный запуск
Вы можете применить более прямой, но менее удобный способ запуска командного файла - вызвав shell с ключом -c filename. Пример:
% /bin/csh -c mycommand arg1 arg2 arg3...
где сразу же за ключом должно следовать имя запускаемого файла. Требуемые аргументы указываются после. Отметим, что при таком способе запуска файл может и не иметь атрибута исполняемости.
Кавычки
В синтаксисе shell кавычки играют важную роль. Есть три типа кавычек: простые ("), двойные (") и обратные (`).
Простые кавычки используются для выделения текста, который оболочка должна понимать буквально. Иными словами, текст внутри простых кавычек не подлежит раскрытию и интерпретации. Пример:
echo "Dollar is $good"
получим букально Dollar is $good несмотря на то, что знак доллара является метасимволом оболочки.
Двойные кавычки выделяют строку символов, которую оболочка будет считать одним словом. Пример:
set colors="green blue red"; echo $#colors
выдаст цифру 1, что означает, что переменная colors простая, а не массив. Все что находится внутри двойных кавычек подлежит интерпретации оболочкой.
Обратные кавычки позволяют представить строку, которая состоит из результата выполнения команды. Так что выражение в обратных кавычках рассматривается как команда, которую оболочка выполняет, а то, что эта команда выведет на стандартный вывод подставляется как строка на то место, где стоят эти обратные кавычки. Пример:
занесет в переменную mytty ту строку, которую выдает команда tty (а именно имя и номер текущего терминала).
Наверняка почти все читатели Хабра знают оболочки sh и bash. Так же большинство из нас что-то слышали про zsh и tcsh. Однако на этом список существующих оболочек не заканчивается. Условно можно разделить их на три группы:
Наибольшее распространение получили POSIX-совместимые оболочки, ведущие родословную от Bourne shell (шелл Борна), поэтому с него и начнем
Bourne shell , исполняемый файл: sh . Командная оболочка названная в честь своего создателя Стивена Борна. Большая часть операторов была заимствована им из языка Алгол 68. Вышла в 7-м издании операционной системы UNIX, где была оболочкой по умолчанию. До сих пор подавляющее большинство Unix-подобных систем имеют /bin/sh - символическую или жесткую ссылку на sh-совместимую оболочку.
Bourne again shell , исполняемый файл: bash . Название можно перевести, как «Возрождённый шел Борна». Скорее всего самая популярная оболочка на сегодняшний день. Де-факто стандарт для Linux. Не буду на ней останавливаться, т.к. в интернете много хороших статей про bash. Например вот и вот .
Z shell
, исполняемый файл: zsh
. Свободная современная sh-совместимая оболочка. Имеет ряд преимуществ перед bash касающихся в основном работы в интерактивном режиме. О ней на Хабре писали и
Кроме того существует довольно много оболочек попадающих в эту группу: Korn shell (ksh) и Almquist shell (ash) etc но не будем подробно на них останавливаться.
C shell , исполняемый файл: csh Командная оболочка разработанная автором vi Биллом Джоем . За основу для скриптового языка csh был взят, как понятно из названия, язык C. Т.к. на тот момент, в 1978 г., это был наиболее популярный язык программирования среди разработчиков и пользователей BSD UNIX. В настоящий момент более популярна свободная реализация csh - tcsh.
TENEX C Shell
, исполняемый файл: tcsh
. Именно в tcsh когда-то впервые появилось автодополнение. Является оболочкой по умолчанию в FreeBSD. Подробнее о ней почитать можно .
Для того чтоб наглядно показать разницу в синтаксисе приведу несколько примеров скриптов делающих одно и то же для csh и sh-совместимого командного интерпретатора.
Условная конструкция:
Цикл вычисляющий 10 первых степеней двойки:
#!/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 |
Однако список фичь поддерживаемых свежими версиями bash, zsh и tcsh очень похож и выбор конкретной оболочки по большей части дело вкуса. С менее распространенными оболочками дело обстоит иначе. Тут различия существеннее.
Perl Shell
, исполняемый файл: psh
. Оболочка сочетающая в себе функции вышеупомянутых оболочек и мощь языка Perl. Т.к. psh написана на perl она может запускаться даже на Windows. Несколько примеров использования psh:
ls | s/y/k/ # Замена c помощью регулярных выражений
ls | { print ++$i, ": $_"; }q # Быстрые фильтр. Внутри фигурных скобок выражение на perl, где $_ содержит одну строку вывода.
netstat | { $_>2; }g # grep-фильтры. Выводятся только те строки для которых выражение в скобках возвращает true
command >[=FOO] # Перенаправление по дескриптору открытого файла
command > file # Эквивалентно command 2> file на bash. Перенаправляет в файл поток вывода и ошибок
grep foo lib/**/*.pm # Использование **, что означает текущий каталог и все подкаталоги
Scsh
, исполняемый файл scsh
. Командный интерпретатор с открытым кодом использующий в качестве скриптового языка Scheme 48. Не поддерживает стандартные для других оболочек функции (история команд, редактирование текста в командной строке, дополнение путей/команд). Рекомендуется написания скриптов, но не для интерактивной работы. Может прийтись по вкусу любителям функционального программирования. Ниже приведен пример скрипта, который выводит имена всех исполняемых файлов находящихся в каталогах из переменной окружения PATH
#!/usr/local/bin/scsh -s
!#
(define (executables dir)
(with-cwd dir
(filter file-executable? (directory-files dir #t))))
(define (writeln x) (display x) (newline))
(for-each writeln
(append-map executables ((infix-splitter ":") (getenv "PATH"))))
IPython
. Это интерактивная оболочка для языка программирования Python, имеющая ряд дополнительных функций. IPython имеет специальный профиль для работы в качестве системной командной оболочки. Способ запуска этого режима зависит, как я понял, от версии, но на моей машине это выглядит так:
ipython3 --profile=pysh
О IPython уже написано довольно много в том числе и на русском языке (ссылки в конце статьи). Постараюсь перечислить его основные фичи с точки зрения применения его как командной оболочки:
Sleep Dummy Shell , исполняемый файл: sleepshell . Строго говоря командным процессором sleepshell назвать нельзя, т.к. он не умеет обрабатывать команды. И вообще не умеет ничего, кроме как периодически записывать в стандартный вывод звёздочки "*". Однако используется она именно в качестве командной оболочки и вот для чего: Допустим мы хотим предоставить кому-то возможность делать тоннели ssh через наш сервер под управлением Linux или Unix. Подробнее про ssh-туннелирование читаем . Но нам не нужно при этом, что этот кто-то получил доступ к командной строке и файловой системе нашего сервера. Для такого случая и предназначена sleepshell. Создаем на сервере аккаунт в качестве шела для него устанавливаем sleepshell. Владелец аккаунта сможет подключаться и пробрасывать порты, но не сможет выполнять команды.
На этом всё. Надеюсь, что было интересно. Буду рад любым замечаниям и советам по тексту статьи.