Запуск скриптов

Shell script - скрипт командной оболочки

В простейшем случае, шелл скрипт ( shell script ) -- это ни что иное, как простая последовательность команд системы, записанная в простой текстовый файл. Создание скриптов поможет сохранить ваше время и силы, которые тратятся на ввод последовательности команд всякий раз, когда необходимо их выполнить. Например:

Шелл скрипт для очистки лог-файлов в /var/log

  1. # cleanup
  2. # Для работы сценария требуются права root.
  3. cd /var/log
  4. cat /dev/null > messages
  5. cat /dev/null > wtmp
  6. echo "Лог-файлы очищены."

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

Sha-bang

Sha-bang - это двухбайтовая последовательность #!, после которой указывается, какой интерпретатор необходимо использовать для запуска скрипта, интерпретации и выполнения команд. В качестве интерпретатора может выступать как одна из системных оболочек ( см. файл /etc/shells) например bash или csh так и любой другой интерпретатор команд или просто утилита. Вот несколько примеров маркера sha-bang:

#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f

Каждая, из приведенных выше сигнатур, вызывает определенный интерпретатор, будь то /bin/sh -- командный интерпретатор по-умолчанию (bash для Linux-систем), либо иной. При переносе сценариев с сигнатурой #!/bin/sh на другие Unix системы, где в качестве командного интерпретатора установлена другая системная оболочка, вы можете лишиться некоторых функциональных возможностей, присущих bash. Поэтому такие сценарии должны быть POSIX совместимыми.

Portable Operating System Interface, попытка стандартизации UNIX-подобных операционных систем.

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

  1. #!/bin/bash
  2. echo "Первая часть сценария."
  3. a=1
  4. #!/bin/bash
  5. # Это *НЕ* означает запуск нового сценария.
  6. echo "Вторая часть сценария."
  7. echo $a  # Значение переменной $a осталось равно 1.

Обратите внимание на то, что сигнатура должна указывать правильный путь к интерпретатору, в противном случае вы получите сообщение об ошибке -- как правило это "Command not found".

Сигнатуру #! можно не указывать, если вы не используете команд специфичных для какого-то конкретного интерпретатора. Например как в расширенной версии скрипте, представленной ниже. Здесь используется специфическая конструкция присвоения значения переменной lines=50.

Еще раз замечу, что сигнатура #!/bin/sh вызывает командный интерпретатор по-умолчанию -- /bin/bash в Linux-системах.

Расширенная версия предыдущего шелл скрипта

  1. #!/bin/bash
  2. # cleanup, version 2
  3. # Для работы сценария требуются права root.
  4.  
  5. LOG_DIR=/var/log
  6. ROOT_UID=0     # Только пользователь с $UID 0 имеет привилегии root.
  7. LINES=50       # Количество сохраняемых строк по-умолчанию.
  8. E_XCD=66       # Невозможно сменить каталог?
  9. E_NOTROOT=67   # Признак отсутствия root-привилегий.
  10.  
  11. if [ "$UID" -ne "$ROOT_UID" ]
  12. then
  13.   echo "Для работы сценария требуются права root."
  14.   exit $E_NOTROOT
  15. fi
  16.  
  17. if [ -n "$1" ]
  18. # Проверка наличия аргумента командной строки.
  19. then
  20.   lines=$1
  21. else
  22.   lines=$LINES # Значение по-умолчанию, если число не задано в командной строке
  23. fi
  24.  
  25. #  Stephane Chazelas предложил следующее,
  26. #+ для проверки корректности аргумента, переданного из командной строки,
  27. #+ правда это достаточно сложно для данного руководства.
  28. #
  29. #    E_WRONGARGS=65  # Не числовой аргумент
  30. #
  31. #    case "$1" in
  32. #    ""      ) lines=50;;
  33. #    *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;
  34. #    *       ) lines=$1;;
  35. #    esac
  36. #
  37. #* Конец проверки корректности аргумента
  38.  
  39. cd $LOG_DIR
  40.  
  41. if [ `pwd` != "$LOG_DIR" ]  # или   if [ "$PWD" != "$LOG_DIR" ]
  42.                             # Не в /var/log?
  43. then
  44. echo "Невозможно перейти в каталог $LOG_DIR."
  45. exit $E_XCD
  46. fi  # Проверка каталога перед очисткой лог-файлов.
  47.  
  48. # более эффективный вариант:
  49. #
  50. # cd /var/log || {
  51. #   echo "Невозможно перейти в требуемый каталог." >&2
  52. #   exit $E_XCD;
  53. # }
  54.  
  55. tail -$lines messages > mesg.temp # Сохранить последние строки в лог-файле.
  56. mv mesg.temp messages
  57.  
  58. # cat /dev/null > messages
  59. #* Необходимость этой команды отпала, поскольку очистка выполняется выше.
  60.  
  61. cat /dev/null > wtmp  #  команды ': > wtmp' и '> wtmp'  имеют тот же эффект.
  62. echo "Лог-файлы очищены."
  63.  
  64. exit 0
  65. #  Возвращаемое значение 0
  66. #+ указывает на успешное завершение работы сценария.

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

Запуск скриптов

Запустить скрипт системной оболочки можно командой sh scriptname или bash scriptname. Более удобный вариант -- сделать файл скрипта исполняемым, командой chmod.

chmod 555 scriptname # установить права на чтение/исполнение любому пользователю в системе. 

или

chmod +rx scriptname  # установить права на чтение/исполнение любому пользователю в системе

chmod u+rx scriptname # установить права на чтение/исполнение только владельцу скрипта

После того, как вы сделаете файл сценария исполняемым, вы можете запустить его примерно такой командой ./scriptname. При этом, если текст скрипта начинается с корректной сигнатуры sha-bang, для выполнения данного скрипта будет вызван соответствующий интерпретатор.

И наконец, завершив отладку сценария, вы можете поместить его в каталог /usr/local/bin (естественно, что для этого вы должны обладать правами root), чтобы сделать его доступным для себя и других пользователей системы. После этого сценарий можно вызвать, просто напечатав название файла в командной строке и нажав ENTER.

Комментарии

Народ! Хелп в обучении!

Привет всем. Новичок я, учусь на прогера, но понимаю, что там нихррена стоящего не дают... Кто может хоть чем то помочь, что то посоветовать, с чего начать? Хотелось бы освоить для начала Си, OpenGL. А потом ещё добавить Python, PHP, Java и скрипты научиться писать. Может посоветуете с чего начать? Что почитать? Как проще освоить? Иными словами, все, чем можете:) Так же в какой среде проще прогить в каждом конкретном случае, тоже хотелось бы узнать. Заранее спасибо.