О разных командных оболочках Linux и Unix. Основы программирования в командной оболочке shell

=====================================================

ЛАБОРАТОРНАЯ РАБОТА № 1 (время выполнения -- 3 часа)

Тема: ”Введение в shell

1. Введение в shell

Shell– это интерпретатор команд (командный процессор), осуществляющий функции интерфейса между пользователем и ядром Unix. Solarisпредлагает три основных командных процессора:

    Принятый по умолчанию командный процессор Bourne-- /sbin/sh

    Командный процессор C -- /bin/csh

    Командный процессор Korn-- ./bin/ksh

Кроме перечисленных, Solarisпредоставляет еще дополнительные оболочки:

    J-оболочка -- /sbin/jsh

    Restricted Korn l -- /usr/ bin/rsh

    T-оболочка -- /usr/bin/tcsh

    GNU Bourne Again -- /usr/bin/bash

    Z-оболочка – usr/bin/zsh

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

2. Запуск команд

Любая команда в Unix состоит из имени запускаемой программы (команды), опций (ключей) и аргументов, передаваемых программе. Разделителем в командной строке является пробелы или знаки табуляции.

Пример

$ /bin/ping –t 10 192.168.2.13

аргумент

приглашение shell

Если при запуске программы не указывается путь к исполняемому файлу, то ОС последовательно просматривает каталоги, задаваемые в переменной PATH. Если в просматриваемом каталоге находится программа с таким именем, то она запускается на выполнение. Текущий рабочий каталог при поиске программ не просматривается, только если он не задан в переменной PATH.

! В целях безопасности администратору не рекомендуется добавлять текущий каталог и домашние (личные) каталоги пользователя в переменную PATH.

Примеры

Запуск программы с указанием полного пути

$ / usr / local / bin / my _ program

Запуск программы из вышестоящего (родительского) каталога

$ ../ local / bin / my _ program

Запуск программы из текущего каталога

$ ./ my _ program

3. Специальные символы в shell

Некоторые символы в shell имеют специальное значение.

3.1. Шаблоны генерации имен файлов

? (вопросительный знак) соответствует любому одному символу, кроме первой точки;

(квадратные скобки) определяют группу символов (выбирается один символ из группы);

- (знак “минус”) определяет диапазон допустимых символов;

! (восклицательный знак) отвергает следующую за ним группу символов;

* (символ “звездочка”) соответствует любому количеству символов, кроме первой точки.

3.2. Символы перенаправления ввода/вывода

< - перенаправление ввода;

>, >> - перенаправление вывода;

2>, 2>> - перенаправление сообщений об ошибках;

| - конвейер.

3.3. Симолы подстановки

$имя_переменно q - подстановка переменных;

$(команда) или `команда` - подстановка команд;

~ - тильда-подстановка.

4. Поиск

Для быстрого поиска файлов и каталогов используется команда whereis, для более глубокого – командаfind(поиск файлов, удовлетворяющих заданным требованиям;).

5. Текстовый редактор vi

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

Редактор vi имеет 3 режима работы (см.рисунок).

Вход в редактор vi

Выход из vi

Знаком ”~” (тильда) в первой позиции помечаются пустые (несуществующие) строки файла.

Основным режимом является командный, в котором команды вводятся нажатием некоторой последовательности клавиш (на экране никак не отображаются).

Перемещение по тексту в командном режиме осуществляется с помощью стрелок и клавиш (влево), (вниз), (вверх), (вправо).

Некоторые команды vi приведены в таблице.

Удаление текущей строки

Копирование текущей строки в буфер

Yдвижение курсора

Занесение отмеченных курсором символы в буфер

Вставка новой строки снизу

Вставка новой строки сверху

Добавление после курсора

Добавление после текущей строки

Вставка перед курсором

Вставка перед текущей строкой

Замена символа на символ, вводимый с клавиатуры

Вставка текста из буфера

. (точка)

Повтор последней выполненной команды

Отмена последней команды

Отмена всех изменений в текущей строке

Удаление символа над курсором

В режиме ввода все набранные на клавиатуре символы вставляются в текст.

В режиме последней строки вводимая команда отображается в последней строке экрана.

6. Помощь

В Unix имеется электронный справочник, содержащий описание предназначения команд, их синтаксиса, примеры использования и пр. Справочник вызывается командой man:

7. Основные команды shell

who – вывод информации об активных пользователях;

echo – вывод сообщений на терминал;

banner – вывод сообщений на терминал прописными буквами;

man – вызов оперативной справочной системы;

date – вывод текущей даты;

write – передача сообщений на терминал другого пользователя;

mesg – разрешение/запрет вывода сообщений от других пользователей;

mail – отправка/получение почты;

news – знакомство с новостями системы;

pwd – вывод абсолютного маршрутного имени текущего рабочего каталога;

cd – изменение рабочего каталога;

ls – вывод информации о содержимом каталога;

mkdir – создание каталога;

rmdir – удаление каталога;

touch – обновление временной метки файла;

cp – копирование файлов;

cat – объединение и вывод на экран содержимого файлов;

more – постраничный просмотр содержимого файла.

mv – перемещение или переименование файла;

rm – удаление файла;

alias – создание псевдонима;

tr – преобразование символов;

exit – завершение текущегоshell -а;

tee – перехват результатов конвейера;

cut – выделение полей из строки;

grep – поиск по шаблону;

pr – вывод файла на стандартный вывод в заданном формате;

sort – сортировка;

head – вывод первых строк файла;

tail – вывод последних строк файла;

wc – подсчет количества символов, слов и строк;

read , echo - чтение и вывод значений переменных;

test - оценивание значения выражения;

expr , let - вычисление арифметических выражений;

8. Shell -программы

Shellпозволяет сохранять последовательность команд в файле и затем выполнять ее. Чтобы запускать файл с shell-программой на выполнение, нужно добавить к правам доступа право на исполнение:

$ chmod +x имя_файла_с_программой

Ветвление в shell-программах организуется с помощью операторов:

if-then-else

Операторы цикла:

УПРАЖНЕНИЯ

1. Какие из приведенных ниже команд приведут в выдаче приветственного сообщения на экран? Какие нет? Почему?

$ echo hello

$ Echo hello

$ echo HELLO, WORLD

$ banner hello

$ BANNER HELLO , WORLD

2. Выведите сообщение из нескольких строк с помощью команд echo иbanner.

3. Выведите дату в две строки: на первой день, месяц, год, на второйтекущее время, снабдив вывод комментарием.

4. Используя команду write , пошлите сообщение на консоль. Пошлите сообщения на несколько терминалов одновременно.

5. Используя команду mesg , определите, разрешены ли сообщения на Ваш терминал. Запретите сообщения. Какова будет реакция системы, если кто-нибудь попытается передать Вам сообщение?

6. Определите имя своего HOME -каталога.

7. Просмотрите поддерево каталогов, начиная с каталога /export/homeс помощью командcd, ls иpwd.

8.. Создайте в своем HOME -каталоге подкаталоги вида:

fruits flowers

apple pear grapes rose violet dandelion

dark green

9. Находясь в своем HOME -каталоге, создайте следующие подкаталоги, используя одну командную строку:

A/B/C/D

10. Находясь в своем HOME -каталоге, удалите все подкаталоги каталогаA.

11. Находясь в HOME -каталоге, создайте файлmacintosh в имеющемся каталогеapple и несколько файлов в каталогахdark иgreen . Войдите в каталогf lowers . Находясь в каталогеf lowers , скопируйте все подкаталогиf ruits вместе с находящимися в них файлами в специально созданный каталогbasket .

12. Находясь в каталоге f lowers , удалите каталогf ruits .

13. Прочитайте файл .profile с помощью командcat иmore.

14. Создайте в HOME -каталоге текстовый файлmyfile из нескольких строк с помощью командыcat. Создайте текстовый файлM y F ile, записав в него такие же строки. Сколько файлов у Вас получилось? Почему?

15. Просмотрите содержимое созданного в задаче 2.2 файла myfile . Скопируйте файлmyfile в файлmycopy. Просмотрите содержимое обоих файлов.

16. Переместите файл mycopy в каталогflowers.

17. Находясь в HOME -каталоге, создайте ссылкуm y link на файлmycopy , находящийся в каталогеflowers . Просмотрите файл-ссылку.

18. Добавьте строку к файлу my link . Какие из файловmy link , my copy , my file изменились? Почему?

19. С использованием какой команды можно определить число ссылок? Определите число ссылок для файлов my link , my copy , my file .

Удалите файл mycopy . Что произошло с файлом-ссылкой? Определите число ссылок для файловmy link , my file .

20. Создайте псевдоним dir , распечатывающий содержимое текущего каталога в расширенном формате.

21. Завершите сеанс работы и вновь зарегистрируйтесь. Работает ли псевдоним dir ? Что следует сделать, чтобы псевдоним «не терялся» между сеансами?

22. Создайте псевдоним point , распечатывающий список находящихся в рабочем каталоге файлов, имена которых начинаются с точки.

23. Используя команду touch , создайте файлы в новом каталоге с такими именами, чтобы одновременно:

Шаблону a * соответствовало 5 файлов;

Шаблону * a соответствовало 4 файла;

Шаблону ??.? соответствовало 3 файла;

Шаблону * aa * соответствовало 2 файла;

Шаблону??? соответствовал 1 файл.

24. Какую команду следует ввести, чтобы сделать следующее:

а) вывести имена всех файлов, начинающихся с точки;

б) вывести имена всех файлов, оканчивающихся на “.txt” ;

в) вывести имена всех файлов, содержащие слово “my” ;

25. Замените в одном заданном файле все строчные буквы на прописные, в другом – все прописные на строчные. Исключите из файла все повторяющиеся пробелы.

26. Создайте файл с именем * . Удалите только этот файл. Будьте осторожны при использовании символов генерации имен фпйлов!

27. Создайте файл, в имени которого есть символ «пробел». Как удалить такой файл?

28. С использованием команды cat удвойте содержимое файла, приписав исходное содержимое к концу этого же файла. Перейдите в каталогflowers . Добавьте в файлspisok список содержимого каталогаflowers. Просмотрите содержимое файла

29. Попытайтесь прочитать с помощью команды cat несуществующий файл. Какова реакция системы? Сделайте то же самое, перенаправив сообщения об ошибках в файлmyerror . Что Вы видите на экране? Просмотрите файлmyerror .

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

31. Измените построенный конвейер так, чтобы список сохранялся в файле spisok ВашегоHOME -каталога, а на экран выводилось только число файлов в списке.

32. Выведите на экран содержимое файла /etc/passwd , упорядоченное по полю с именем пользователя.

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

33. Выведите текущую дату на экран большими буквами с помощью команд date иbanner.

34. Присвойте переменной IAM Ваше имя регистрации. Запустите еще одинshell . Видите ли Вы эту переменную? Что нужно сделать, чтобы увидеть ее в порожденномshell ? Измените значение переменнойIAM в порожденномshell . Выйдите из порожденногоshell . Посмотрите значение этой переменной в исходномshell . Объясните результат.

35. Напишите shell -программуinfo , которая будет просить пользователя ввести имя, адрес, число, месяц и год рождения и выводить эту информацию в обратном вводу порядке

36. Напишите shell -программу, которая будет выводить на экран приглашение на ввод числа, сохранять введенное число в переменнойY , и печатать сообщение“Y is greater than 7”, если значениеY больше 7, и“Y is not greater than 7” в противном случае.

37. Напишите shell-программу, которая выводит на экран следующую статистику:

а) свое имя;

б) количество аргументов, с которыми она запущена;

в) печатает каждый свой аргумент и длину аргумента в символах;

38. Напишите shell -программу, которая определяет количество аргументов в командной строке и выдает сообщение об ошибке, если количество аргументов не равно трем, или сами аргументы, если их количество равно трем.

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

40. Напишите shell-программу hello , обеспечивающую следующую реакцию на аргументы командной строки:

Аргумент “-d” - программа будет выполнять командуdate ;

Аргумент “-l” - программа выведет содержимое текущего каталога;

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

41. Напишите программу words , которая будет выдавать пользователю приглашение на ввод по одному слову до тех пор, пока он не введет словоend . Запомните все введенные слова. После ввода словаend выведите на экран все введенные слова.

42. Измените приглашение системы так, чтобы оно содержало полное маршрутное имя текущего рабочего каталога.

43. Напишите программу virus , которая создают свою выполняемую копию с другим именем, а затем сама себя удаляет.

44. Напишите программу virus 2 , которая ищет в текущем каталоге программы командного языка и добавляет в их текст команду вывода на экран словаInfected !”.

45. Напишите программу virus 3 , которая добавляет к найденным ею программам командного языка свой код для заражения других программ.

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

47. Напишите программу antivirus , которая бы находила все зараженные вашим вирусомshell-программы.

48. Модифицируйте разработанную программу так, чтобы она не только находила зараженные программы в указанном ей каталоге, но и “вылечивала” бы их, сохраняя зараженную версию в новом файле, к имени которого добавлено окончание . vir , и снимая с такого файла атрибут выполнения.

49. Напишите программу virus 5 , которая бы:

а) заражала бы вирусом shell-программы в текущем каталоге и его подкаталогах, только если пользователь вводил командуls ;

б) вела бы себя как команда ls , ничем не выдавая на терминале своей работы.

50. Напишите программу virus6 на основе программvirus 2 -virus 5 , заражающий код которой нельзя было бы обнаружить разработанной Вами программойantivirus , а заражение происходило бы при любом значении переменнойPATH .

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

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

Как уже говорилось выше, для построения произвольных алгоритмов необходимо иметь операторы проверки условий. Оболочка bash поддерживает операторы выбора if then else и case , а также операторы организации циклов for , while , until , благодаря чему она превращается в мощный язык программирования.

5.8.1 Операторы if и test (или )

Конструкция условного оператора в слегка упрощенном виде выглядит так:

if list1 then list2 else list3 fi

где list1 , list2 и list3 — это последовательности команд, разделенные запятыми и оканчивающиеся точкой с запятой или символом новой строки. Кроме того, эти последовательности могут быть заключены в фигурные скобки: {list} .

Оператор if проверяет значение, возвращаемое командами из list1 . Если в этом списке несколько команд, то проверяется значение, возвращаемое последней командой списка. Если это значение равно 0, то будут выполняться команды из list2 ; если это значение не нулевое, будут выполнены команды из list3 . Значение, возвращаемой таким составным оператором if , совпадает со значением, выдаваемым последней командой выполняемой последовательности.

Полный формат команды if имеет вид:

if list then list [ elif list then list ] ... [ else list ] fi

(здесь квадратные скобки означают только необязательность присутствия в операторе того, что в них содержится).

В качестве выражения, которое стоит сразу после if или elif , часто используется команда test , которая может обозначаться также квадратными скобками . Команда test выполняет вычисление некоторого выражения и возвращает значение 0, если выражение истинно, и 1 в противном случае. Выражение передается программе test как аргумент. Вместо того, чтобы писать

test expression,

можно заключить выражение в квадратные скобки:

[ expression ].

Заметьте, что test и [ — это два имени одной и той же программы, а не какое-то магическое преобразование, выполняемое оболочкой bash (только синтаксис [ требует, чтобы была поставлена закрывающая скобка). Заметьте также, что вместо test в конструкции if может быть использована любая программа.

В заключение приведем пример использования оператора if :

if [ -e textmode2.htm ] ; then

ls textmode*

else

pwd

Об операторе test (или […]) надо бы поговорить особо.

5.8.2 Оператор test и условные выражения

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

    A file

Верно, если файл с именем file существует.

    B file

Верно, если file существует и является специальным файлом блочного устройства.

    C file

Верно, если file существует и является специальным файлом символьного устройства.

    D file

Верно, если file существует и является каталогом.

    E file

Верно, если файл с именем file существует.

    F file

Верно, если файл с именем file существуети является обычным файлом.

    G file

Верно, если файл с именем file существуети для него установлен бит смены группы.

    H file или -L file

Верно, если файл с именем file существуети является символической ссылкой.

    K file

Верно, если файл с именем file существуети для него установлен "sticky"" bit.

    P file

Верно, если файл с именем file существуети является именованным каналом (FIFO).

    R file

Верно, если файл с именем file существуети для него установлено право на чтение

    S file

Верно, если файл с именем file существуети его размер больше нуля .

    T fd

Верно, если дескриптор файла fd открыт и указывает на терминал.

    U file

Верно, если файл с именем file существуети для него установлен бит смены пользователя.

    W file

Верно, если файл с именем file существуети для него установлено право на запись.

    X file

Верно, если файл с именем file существуети является исполняемым .

    O file

Верно, если файл с именем file существуети его владельцем является пользователь, на которого указывает эффективный идентификатор пользователя.

    G file

Верно, если файл с именем file существуети принадлежит группе, определяемой эффективным идентификатором группы.

    S file

Верно, если файл с именем file существуети является сокетом.

    N file

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

    file1 -nt file2

Верно, если файлfile1 имеет более позднее время модификации, чем file2 .

    file1 -ot file2

Верно, если файлfile1 старше , чем file2 .

    file1 -ef file2

Верно, если файлыfile1 и file2 имеют одинаковые номера устройств и индексных дескрипторов (inode).

    O optname

Верно, если задействована опция оболочки optname . Пояснения см. на странице man bash.

    Z string

Верно, если длина строки равна нулю.

    N string

Верно, если длина строки не равна нулю.

    string1 == string2

Верно, если строки совпадают. Вместо == может использоваться = .

    string1 !== string2

Верно, если строки не совпадают.

    string1 < string2

Верно, если строка string1 лексикографически предшествует строке string2 (для текущей локали).

    string1 > string2

Верно, если строка string1 лексикографически стоит после строки string2 (для текущей локали).

    arg1 OP arg2

Здесь OP — это одна из операций арифметического сравнения: -eq (равно), -ne (не равно), -lt (меньше чем), -le (меньше или равно), -gt (больше), -ge (больше или равно). В качестве аргументов могут использоваться положительные или отрицательные целые.

Из этих элементарных условных выражений можно строить сколь угодно сложные с помощью обычных логических операций ОТРИЦАНИЯ, И и ИЛИ:

    !(expression)

Булевский оператор отрицания.

    expression1 -a expression2

Булевский оператор AND (И). Верен, если верны оба выражения.

    expression1 -o expression2

Булевский оператор OR (ИЛИ). Верен, если верно любое из двух выражений.

Такие же условные выражения используются и в операторах while и until , которые мы рассмотрим чуть ниже.

5.8.3 Оператор case

Формат оператора case таков:

case word in [ [(] pattern [ | pattern ] ...) list ;; ] ... esac

Команда case вначале производит раскрытие слова word , и пытается сопоставить результат с каждым из образцов pattern поочередно. После нахождения первого совпадения дальнейшие проверки не производятся, выполняется список команд, стоящий после того образца, с которым обнаружено совпадение. Значение, возвращаемое оператором, равно 0, если совпадений с образцами не обнаружено. В противном случае возвращается значение, выдаваемое последней командой из соответствующего списка.

Следующий пример использования оператора case заимствован из системного скрипта /etc/rc.d/rc.sysinit.

case "$UTC" in

yes|true)

CLOCKFLAGS="$CLOCKFLAGS -u";

CLOCKDEF="$CLOCKDEF (utc)";

no|false)

CLOCKFLAGS="$CLOCKFLAGS --localtime";

CLOCKDEF="$CLOCKDEF (localtime)";

esac

Если переменная принимает значение yes или true, то будет выполнена первая пара команд, а если ее значение равно no или false - вторая пара.

5.8.4 Оператор select

Оператор select позволяет организовать интерактивное взаимодействие с пользователем. Он имеет следующий формат:

select name [ in word; ] do list ; done

Вначале из шаблона word формируется список слов, соответствующих шаблону. Этот набор слов выводится в стандартный поток ошибок, причем каждое слово сопровождается порядковым номером. Если шаблон word пропущен, таким же образом выводятся позиционные параметры. После этого выдается стандартное приглашение PS3, и оболочка ожидает ввода строки на стандартном вводе. Если введенная строка содержит число, соответствующее одному из отображенных слов, то переменной name присваивается значение, равное этому слову. Если введена пустая строка, то номера и соответствующие слова выводятся заново. Если введено любое другое значение, переменной name присваивается нулевое значение. Введенная пользователем строка запоминается в переменой REPLY . Список команд list выполняется с выбранным значением переменной name .

Вот небольшой скрипт:

#!/bin/sh

echo "Какую ОС Вы предпочитаете?"

select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do

break

done

echo "Вы бы выбрали $var"

Какую ОС Вы предпочитаете?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#?

Нажмите любую из 4 предложенных цифр (1,2,3,4). Если вы, например, введете 1, то увидите собщение:

“Вы бы выбрали Linux”

5.8.5 Оператор for

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

for name in words do list done.

Правила построения списков команд (list ) такие же, как и в операторе if .

Пример. Следующий скрипт создает файлы foo_1, foo_2 и foo_3:

for a in 1 2 3 ; do

touch foo_$a

done

В общем случае оператор for имеет формат:

for name [ in word; ] do list ; done

Вначале производится раскрытие слова word в соответствии с правилами раскрытия выражений, приведенными выше. Затем переменной name поочередно присваиваются полученные значения, и каждый раз выполняется список команд list . Если "in word " пропущено, то список команд list выполняется один раз для каждого позиционного параметра, который задан.

В Linux имеется программа seq , которая воспринимает в качестве аргументов два числа и выдает последовательность всех чисел, расположенных между заданными. С помощью этой команды можно заставить for в bash работать точно так же, как аналогичный оператор работает в обычных языках программирования. Для этого достаточно записать цикл for следующим образом:

for a in $(seq 1 10) ; do

cat file_$a

done

Эта команда выводит на экран содержимое 10-ти файлов: " file_1", ..., "file_10".

5.8.6 Операторы while и until

Оператор while работает подобно if , только выполнение операторов из списка list2 циклически продолжается до тех пор, пока верно условие, и прерывается, если условие не верно. Конструкция выглядит следующим образом:

while list1 do list2 done.

while [ -d mydirectory ] ; do

ls -l mydirectory >> logfile

echo -- SEPARATOR -- >> logfile

sleep 60

done

Такая программа будет протоколировать содержание каталога "mydirectory" ежеминутно до тех пор, пока директория существует.

Оператор until аналогичен оператору while :

until list1 do list2 done.

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

5.8.7 Функции

Синтаксис

Оболочка bash позволяет пользователю создавать собственные функции. Функции ведут себя и используются точно так же, как обычные команды оболочки, т. е. мы можем сами создавать новые команды. Функции конструируются следующим образом:

function name () { list }

Причем слово function не обязательно, name определяет имя функции, по которому к ней можно обращаться, а тело функции состоит из списка команд list , находящегося между { и }. Этот список команд выполняется каждый раз, когда имя name задано как имя вызываемой команды. Отметим, что функции могут задаваться рекурсивно, так что разрешено вызывать функцию, которую мы задаем, внутри нее самой.

Функции выполняются в контексте текущей оболочки: для интерпретации функции новый процесс не запускается (в отличие от выполнения скриптов оболочки).

Аргументы

Когда функция вызывается на выполнение, аргументы функции становятся позиционными параметрами (positional parameters) на время выполнения функции. Они именуются как $n , где n — номер аргумента, к которому мы хотим получить доступ. Нумерация аргументов начинается с 1, так что $1 — это первый аргумент. Мы можем также получить все аргументы сразу с помощью $* , и число аргументов с помощью $# . Позиционный параметр 0 не изменяется.

Если в теле функции встречается встроенная команда return , выполнение функции прерывается и управление передается команде, стоящей после вызова функции. Когда выполнение функции завершается, позиционным параметрам и специальному параметру # возвращаются те значения, которые они имели до начала выполнения функции.

Локальные переменные (local)

Если мы хотим создать локальный параметр, можно использовать ключевое слово local . Синтаксис ее задания точно такой же, как и для обычных параметров, только определению предшествует ключевое слово local: local name=value .

Вот пример задания функции, реализующей упоминавшуюся выше команду seq :

seq()

local I=$1;

while [ $2 != $I ]; do

echo -n "$I ";

I=$(($I + 1))

done;

echo $2

Обратите внимание на опцию -n оператора echo , она отменяет переход на новую строку. Хотя это и несущественно для тех целей, которые мы здесь имеем в виду, это может оказаться полезным для использования функции в других целях.

Функция вычисления факториала fact

Еще один пример:

fact()

if [ $1 = 0 ]; then

echo 1;

else

echo $(($1 * $(fact $(($1 — 1)))))

Это функция факториала, пример рекурсивной функции. Обратите внимание на арифметическое расширение и подстановку команд.

В. Костромин (kos at rus-linux dot net) - 5.8. Shell как язык программирования

Командная оболочка в UNIX является интерфейсом командной строки в Unix -подобных операционных системах, то есть выполняет команды, которые подает пользователь, или которые читаются с файлов. Такие файлы с командами оболочки называются сценариями (скриптами, программами) оболочки. Эти сценарии не компилируются, а интерпретируются оболочкой. Это означает, что оболочка считывает сценарий от начала до конца, строку за строкой, ища указанные там команды и выполняя их; в отличие от этого подхода, компилятор преобразует целую программу к виду, пригодному для выполнения машиной - потом файл с таким кодом можно использовать в сценарии оболочки. Характерная особенность языка оболочки - многие операции, которые в традиционных языках программирования являются встроенными, выполняются с помощью вызова внешних программ.

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

Виды оболочек

UNIX предоставляет на выбор несколько различных оболочек:

sh , или оболочка Борна (Bourne Shell ) одна из первых оболочек, которая была использована в UNIX-подобных средах. Это базовая оболочка, маленькая и с небольшим набором возможностей. Она является де-факто стандартной оболочкой, и присутствует на каждой системе с UNIX. На Линукс / bin / sh может быть символьным линком на bash. Это сделано для того, чтобы обеспечить совместимость с приложениями UNIX. bash , или новая оболочка Борна (Bourne Again Shell ) стандартная оболочка Линукс. У большинства пользователей Линукс стандартной оболочкой установлен именно bash . В некотором смысле bash - это надстройка над sh , набор дополнений и дополнительных модулей. Таким образом, новая оболочка Борна совместима с обычной оболочкой Борна: команды, работающие в sh , будут работать и в bash , но не обязательно наоборот. csh , или C -ориентированная оболочка (C Shell ) синтаксис этой оболочки схож с языком программирования C. Обычно, этой оболочкой пользуются программисты. tcsh , или улучшенная C-ориентированная оболочка (Turbo C Shell ) надстройка над csh . ksh , или оболочка Корна (Korn Shell ) Была написана в начале 1980-х годов и получила лучшие на то время возможности оболочки Борна и csh. Есть надстройкой над оболочкой Борна и гарантирует выполнение скриптов написанных для оболочки Борна. Стандартом POSIX является оболочка Корна с ограниченными возможностями.

В файле / etc / shells находится информация о оболочки, присутствующие в системе:

Mia: ~> cat /etc/shells /Bin/bash /Bin/sh /Bin/tcsh /Bin/csh

Оболочка пользователя устанавливается в файле / etc / passwd. Например, строка пользователя mia , который имеет установленную оболочку bash :

Mia: L2NOfqdlPrHwE: 504:504: Mia Maya:/home/mia:/bin/bash

Переключение между оболочками

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

Mia:~>csh

Для возвращения под управление bash нужно набрать команду exit.

Что такое shell и зачем он нужен

Командная оболочка в любых unix-подобных системах, к которым относится и GNU/Linux, является обычной программой, запускаемой как в текстовой консоли (которая используется всё реже), так и в графической среде – в окне эмулятора терминала, доступного в любой Linux-системе.

Ее задача проста и очевидна: принять строку (или строки) ввода, произвести их синтаксический анализ и на основе результатов этого анализа отреагировать соответствующим образом – выполнить команду, запустить программу, вывести диагностическое сообщение и т.п.

Почти во всех дистрибутивах Linux для пользователей по умолчанию назначается командная оболочка bash (Bourne Again SHell – ещё одна командная оболочка Бурна; Стив Бурн – автор первой командной оболочки в Unix – sh). Фактически она стала неофициальным стандартом, и усовершенствование ее функциональных возможностей продолжается непрерывно. Существуют и другие командные оболочки – tcsh (версия C-shell), ksh (Korn Shell), zsh и т.д. – у каждой есть свои достоинства и недостатки, а также свои группы поклонников. Тем не менее, bash более привычна широким массам пользователей с различными уровнями подготовки, потому я и остановил свой выбор на ней. Стоит также отметить, что какими бы возможностями ни обладали различные оболочки, все они совместимы со своим идеологическим прародителем – Bourn Shell (sh). Иными словами, скрипт, написанный для sh, будет корректно работать в любой современной оболочке (обратно, вообще говоря, неверно).

Преимущества командной строки

Может возникнуть вопрос: зачем возиться с командной строкой, если существуют удобные и красивые графические интерфейсы? Тому есть множество причин. Во-первых, далеко не все операции удобнее и быстрее выполнять с помощью графического интерфейса. Во-вторых, каждая программа следует основополагающему принципу Unix-систем: делать чётко определённую работу и делать её хорошо. Иными словами, вы всегда понимаете, что происходит при запуске той или иной утилиты (если что-то не вполне понятно, то следует обратиться к man-руководству). В-третьих, осваивая команды, пробуя их сочетания и комбинации их параметров, пользователь изучает систему, приобретая ценный практический опыт. Вы получаете доступ к таким эффективным инструментам, как конвейеры, позволяющие организовать цепочку команд для обработки данных, средства перенаправления ввода/вывода, а кроме того, можете программировать непосредственно в командной оболочке. Пожалуй, на программировании стоит остановиться подробнее, тем более что многие системные сценарии в Linux (например, скрипты запуска системных сервисов) написаны для shell.

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

Итак, командную оболочку можно рассматривать как язык программирования и как программную среду выполнения одновременно. Разумеется, этот язык не компилируемый, а интерпретируемый. Он допускает использование переменных: системных или собственных. Последовательность выполнения команд программы изменяется с помощью конструкций проверки условия и выбора соответствующего варианта: if-then-else и case. Циклы while, until и for позволяют автоматизировать многократно повторяющиеся действия. Имеется возможность объединять группы команд в логические блоки. Вы можете даже писать настоящие функции с передачей в них параметров. Таким образом, налицо все признаки и характеристики полноценного языка программирования. Попробуем извлечь из этого двойную пользу – наряду с изучением основ программирования автоматизируем свою повседневную работу.

Hello, World! Простая система резервного копирования

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

#!/bin/bash # # Резервное копирование каталогов и файлов из домашнего каталога # Этот командный скрипт можно автоматически запускать при помощи cron # cd $HOME if [ ! -d archives ] then mkdir archives fi cur_date=`date +%Y%m%d%H%M` if [ $# -eq 0 ] ; then tar czf archive${cur_date}.tar.gz projects bin else tar czf archive${cur_date}.tar.gz $* fi if [ $? = 0 ] ; then mv archive${cur_date}.tar.gz $HOME/archives echo "$cur_date – Резервное копирование успешно завершено." else echo "$cur_date – ОШИБКА во время резервного копирования." fi

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

Далее следуют четыре строки комментариев. Как только командная оболочка встречает символ "#", она считает все последующие символы комментариями и полностью игнорирует их до конца текущей строки. Поэтому комментарий можно начать не с самого начала строки, а сопроводить им какую-либо команду.

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

Наконец-то мы добрались до первой «настоящей» команды. Она позволяет сменить каталог (Change Directory), т.е. перейти из текущего каталога в другой, переданный команде как аргумент. В большинстве случаев целевой каталог задаётся в явной форме, например, cd /tmp или cd projects, но в нашем случае используется предопределённая системная переменная HOME – в ней содержится полный путь к домашнему каталогу текущего пользователя, от имени которого выполняется командный сценарий. Тем самым мы избавляемся от необходимости вносить изменения в код всякий раз при смене пользователя, потому что команда возвращает любого в его личный каталог. Знак доллара "$" перед именем переменной означает, что необходимо извлечь значение, содержащееся в этой переменной, и подставить его в командную строку вместо её имени. Особо следует отметить, что в командном языке оболочки регистров букв имеют важное значение, т.е. HOME, Home и home – это три различные переменные. По соглашению, буквами верхнего регистра обозначаются имена системных переменных: HOME, PATH, EDITOR и т.д. Это соглашение не запрещает пользователям создавать свои переменные с именами из заглавных букв, но зачем усложнять себе жизнь, нарушая общепринятые нормы и правила? Не рекомендуется также изменять значения системных переменных без крайней необходимости. В общем, соблюдаем простое правило: системные переменные используем только для чтения, а если потребовалась собственная, то её имя записываем буквами нижнего регистра.

Нашу первую команду можно было бы записать более кратко:

cd ~

Здесь символ "~" также означает домашний каталог текущего пользователя. Ветераны командной строки выражаются ещё лаконичнее:

cd

Смысл в том, что когда для команды cd не задан никакой аргумент, она выполняет переход в домашний каталог.

На очереди классическая программная конструкция проверки условия и принятия соответствующего решения. Общая схема такова:

if <условие> then <одна или несколько команд> fi

Последнее слово конструкции (if в обратном порядке) выполняет роль закрывающей скобки, т.е. границы списка команд, выполняемых при истинности условия. Присутствие fi обязательно, даже если в списке лишь одна команда.

Для проверки условия, как правило, применяется команда test или её альтернативная форма записи в квадратных скобках. Иначе говоря, записи

if [ ! -d archives ] if test ! -d archives

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

Критерии проверки условия определяются разнообразными флагами. Команда test распознаёт очень большой их список. В нашем примере использован флаг -d, позволяющий проверить, соответствует ли заданное после флага имя реально существующему каталогу (directory). Наиболее часто при работе с файлами применяются следующие флаги:

F – существует ли обычный файл с заданным именем;

R – установлено ли для заданного файла право на чтение из него;

W – установлено ли для заданного файла право на запись в него;

X – установлено ли для заданного файла право на его выполнение;

S – имеет ли заданный файл ненулевой размер.

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

if [ ! -d archives ] Если не существует каталог archives (в текущем каталоге), then то начать выполнение блока команд: mkdir archives создать каталог archives (в текущем каталоге) fi завершить выполнение блока команд.

Как видите, всё оказалось не таким уж и сложным. Немного практики, и вы без труда сможете читать и самостоятельно создавать подобные конструкции. Команда создания каталога настолько очевидна, что дополнительных разъяснений не требуется.

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

ten=10 string="Это строка текста"

Но в нашем примере применяется небольшая хитрость. Обратите внимание, что после знака равенства – символа присваивания – записана команда в обратных кавычках. Такая форма записи позволяет присвоить переменной не саму строку, а результат её выполнения. Здесь это вывод команды date, которая возвращает текущую дату и время в формате, определяемом списком параметров:

%Y – текущий год в полной форме, т.е. из четырёх цифр (например, 2009);

%m – номер текущего месяца (например, 09 – для сентября);

%d – номер текущего дня;

%H – текущий час в 24-часовом формате;

%M – текущая минута.

Таким образом, если выполнить команду

cur_date=`date +%Y%m%d%H%M`

десятого сентября 2009 года в 22:45, то переменной cur_date будет присвоено строковое значение "200909102245". Цель этого ухищрения – сформировать уникальное, не повторяющееся имя архивного файла. Если вы намерены запустить несколько экземпляров программы в течение одной минуты, то можете улучшить уникальность имён, добавляя ещё и текущие секунды. Как? Изучите руководство утилиты date (man date) – в этом нет ничего сложного.

Прежде чем приступить к созданию файла архива, необходимо определить, какие именно каталоги мы будем сохранять в нём. Для большей гибкости можно задать набор каталогов, архивируемых по умолчанию, но предусмотреть возможность замены этого набора списком каталогов, передаваемым как аргумент в наш командный сценарий. Для этого используются специальные переменные командной оболочки: $# – число переданных в сценарий параметров и $* – все переданные параметры, записанные в формате одной строки.

if [ $# -eq 0 ] ; then

Проверка условия «если число переданных параметров равно нулю», то выполнить следующую команду. Отметим, что ключевое слово then можно записать в строке условия, отделив его от условного выражения точкой с запятой.

tar czf archive${cur_date}.tar.gz projects bin

Команда создания архивного файла и сжатия этого файла. Сама утилита tar не выполняет сжатие, а только лишь собирает все заданные файлы и каталоги в единый tar-файл. Для этого предназначен первый флаг - c (create – создать). Сжатие выполняет внешняя программа – здесь это gzip, вызываемый вторым флагом - z. Если в вашей системе установлена более эффективная программа сжатия bzip2, то вы можете воспользоваться ею, изменив команду следующим образом:

tar cjf archive${cur_date}.tar.bz2 projects bin

Третий флаг f сообщает о том, что далее следует имя архивного файла, поэтому всегда является замыкающим в перечне флагов. Обратите внимание на то, что при подстановке имя переменной заключено в фигурные скобки. Это сделано, чтобы явно выделить переменную в окружающей её строке, тем самым устраняя многие потенциальные проблемы. Расширения архивному файлу не присваиваются автоматически, вы сами дописываете всё необходимое. В качестве каталогов, архивируемых по умолчанию, я указал projects и bin, но вы можете записать здесь имена своих наиболее ценных каталогов.

Ключевое слово else открывает альтернативную ветвь выполнения. Команды этого блока начинают работать, если проверка условия даёт результат «ложь» (в нашем примере: «число переданных параметров ненулевое», т.е. пользователь задал имена каталогов). В этом случае команда будет выглядеть так:

tar czf archive${cur_date}.tar.gz $*

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

В конце программы выполняется ещё одна проверка. В unix-средах все команды возвращают код статуса завершения своей работы. Если команда отработала успешно, то она возвращает код 0, в противном случае код завершения будет ненулевым. Чтобы проверить успешность выполнения предыдущей команды архивации, воспользуемся ещё одной специальной переменной $?, в которой всегда содержится значение кода завершения самой последней команды. Если в переменной $? содержится 0, т.е. файл резервной копии был успешно создан, то мы перемещаем его в каталог архивов:

mv archive${cur_date}.tar.gz $HOME/archives

и выдаём соответствующее сообщение:

echo "$cur_date – Резервное копирование успешно завершено."

Если проверка показала, что код завершения операции архивирования не равен нулю, то выводится сообщение об ошибке:

echo "$cur_date – ОШИБКА во время резервного копирования."

На этом работа нашего командного сценария завершается.

Чтобы проверить работу нашей программы, необходимо сохранить описанный выше исходный код в файле, например, с именем bckp, а затем для удобства сделать его выполняемым:

chmod 750 bckp

и запустить:

./bckp

для создания резервной копии каталогов, заданных по умолчанию, и

./bckp docs progs works

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

Можно поместить файл bckp в один из каталогов, указанных в системной переменной PATH. Наиболее предпочтительными местами размещения являются /usr/local/bin или $HOME/bin, если таковые у вас имеются. После этого вы можете запускать bckp как системную команду.

Как автоматизировать операции резервного копирования «по расписанию»

Несколько слов об автоматизации резервного копирования. Для этой цели служит системный планировщик cron, который считывает рабочие инструкции из специального crontab-файла. Чтобы определить такие инструкции, необходимо создать и отредактировать свой crontab-файл при помощи команды:

crontab -e

Инструкции записываются в строго определённом формате (поля разделяются пробелами):

минуты часы день_месяца месяц день_недели команда

Один из вариантов расписания операций резервного копирования может выглядеть следующим образом:

30 23 10,20,30 * * /usr/local/bin/bckp

Это означает, что сценарий резервного копирования (следует указать полный путь к этому файлу) будет выполняться в 23:30 10-го, 20-го и 30-го числа каждого месяца независимо от дня недели. (Звёздочки обозначают весь допустимый диапазон значений, в данном случае: каждый месяц – в 4-м поле, любой день недели – в 5-м поле)

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

0 5 * * 3,5 /usr/local/bin/bckp

Здесь резервные копии будут создаваться в 5:00 по средам и пятницам в каждом месяце (звёздочка в 4-м поле), независимо от числа (звёздочка в 3-м поле).

Обо всех тонкостях составления расписания можно прочитать в руководстве man 5 crontab.

Итоги и выводы

Рассмотренный в данной статье сценарий резервного копирования обладает скромными функциональными свойствами. Но не в этом состояла его главная задача, а в том, чтобы читатель понял, что можно делать в командной строке, и не только скопировал и выполнил предложенный командный файл, а заинтересовался расширением его функций, занялся исследованием необъятных возможностей, предоставляемых командными оболочками. И если кто-то, прочитав эту статью, попробует усовершенствовать приведённый здесь код, или напишет собственный вариант, или реализует свою независимую идею, то я сочту, что основная цель достигнута.

Ресурсы для скачивания

static.content.url=http://www.сайт/developerworks/js/artrating/

ArticleID=458335

ArticleTitle=Основы программирования в командной оболочке shell

Наверняка почти все читатели Хабра знают оболочки sh и bash. Так же большинство из нас что-то слышали про zsh и tcsh. Однако на этом список существующих оболочек не заканчивается. Условно можно разделить их на три группы:

  • Клоны Bourne shell (bash, zsh)
  • C shell (csh, tcsh)
  • Базирующиеся на популярных языках программирования(psh, ipython, scsh)
  • Экзотические, специфические и все остальные
О наиболее интересных из них и пойдет речь.

Целью написания статьи не был обзор или классификация всех существующих командных оболочек. Просто хочу рассказать о некоторых интересных продуктах в этой области, расширить кругозор читателя. Буду рад. если этим сподвигну кого-то к более детальному изучению темы или даже к тому, чтоб перейти на другой шел.
Сначала коротко о том, что же это такое. Командная оболочка или командный интерпретатор- это приложение предоставляющее пользователю интерфейс командной строки в которой тот либо вводит команды по отдельности, либо запускает скрипты состоящие из списка команд. Устно и в неофициальных текстах часто называется «шел», от английского shell - оболочка.

Наибольшее распространение получили POSIX-совместимые оболочки, ведущие родословную от Bourne shell (шелл Борна), поэтому с него и начнем

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

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 уже написано довольно много в том числе и на русском языке (ссылки в конце статьи). Постараюсь перечислить его основные фичи с точки зрения применения его как командной оболочки:

  • Кросплатформенность. Есть даже версия под Windows
  • Python версий 2.x или 3.x в качестве скриптового языка, расширенные возможности интроспекции
  • Автодополнение кода Python а так же имен файлов и системных команд.
  • История команд и макросы на ее основе
  • Механизм ускоряющий навигацию по каталогам, закладки и многое другое
Как видите, по своим интерактивным возможностям IPython как минимум не уступает bash. Что же касается скриптов, то IPython будет удобен тем, кто знает python лучше чем bash. По сути скрипты на IPython будут отличаться от чистого питона только упрошенным вызовом системных команд. Приведу несколько примеров интеграции python и системных команд:
# Допустим нам захотелось посчитать сумарный размер файлов логов dpkg: In : cd /var/log/ /var/log In : log_files = !ls -l dpkg.log* In : log_files Out: "-rw-r--r-- 1 root root 1824 нояб. 3 16:41 dpkg.log" In : for line in log_files: ....: size += int(line.split()) ....: In : size Out: 1330009 # ... или последовательно пингануть десяток хостов In : for i in range(100,110): ....: !ping -c 1 192.168.0.$i ....:
Остальные
Конечно это не полный список даже популярных оболочек. Помимо вышеперечисленных категорий существуют ещё использующие собственный синтаксис, не совместимый с sh и не копирующий существующие ЯП. Примером может служить friendly interactive shell (fish) . Но на последок хотел бы рассказать не о ней, а более специфической sleepshell.

Sleep Dummy Shell , исполняемый файл: sleepshell . Строго говоря командным процессором sleepshell назвать нельзя, т.к. он не умеет обрабатывать команды. И вообще не умеет ничего, кроме как периодически записывать в стандартный вывод звёздочки "*". Однако используется она именно в качестве командной оболочки и вот для чего: Допустим мы хотим предоставить кому-то возможность делать тоннели ssh через наш сервер под управлением Linux или Unix. Подробнее про ssh-туннелирование читаем . Но нам не нужно при этом, что этот кто-то получил доступ к командной строке и файловой системе нашего сервера. Для такого случая и предназначена sleepshell. Создаем на сервере аккаунт в качестве шела для него устанавливаем sleepshell. Владелец аккаунта сможет подключаться и пробрасывать порты, но не сможет выполнять команды.

На этом всё. Надеюсь, что было интересно. Буду рад любым замечаниям и советам по тексту статьи.

Ссылки по теме
www.faqs.org/faqs/unix-faq/shell/shell-differences - сводная таблица различий и сходств командных оболочек
www.mariovaldez.net/software/sleepshell - Sleep Dummy Shell
ipython.org/ipython-doc/dev/interactive/shell.html - IPython as a system shell
www.opennet.ru/base/dev/ipython_sysadmin.txt.html - Оболочка IPython как инструмент системного администратора

В продолжение темы:
Windows

Часть вторая : "Важнейшие характеристики каждого семейства процессоров Intel Core i3/i5/i7. Какие из этих чипов представляют особый интерес" Введение Сначала мы приведём...

Новые статьи
/
Популярные