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

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 и скрипты научиться писать. Может посоветуете с чего начать? Что почитать? Как проще освоить? Иными словами, все, чем можете:) Так же в какой среде проще прогить в каждом конкретном случае, тоже хотелось бы узнать. Заранее спасибо.

да хрень это всё!

да хрень это всё!

да вы гони те нельзя так)))))

да вы гони те нельзя так)))))

да неужели )) еще как можно

да неужели )) еще как можно

ну вы и долбоёбы...

ну вы и долбоёбы...