Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки; Версия 2.5 (15 февраля 2004) | ||
---|---|---|
Назад | Вперед |
Благодаря стандартизации набора команд Unix-систем, сценарии, на языке командной оболочки, могут быть легко перенесены из системы в систему практически без изменений. Мощь сценариев складывется из наборв системных команд и директив командной оболочки с простыми программными конструкциями.
Первая команда, с которой сталкиваются новички
Команда вывода "списка" файлов. Многие недооценивают всю мощь этой скромной команды. Например, с ключом -R, рекурсивный обход дерева каталогов, командв ls выводит содержимое каталогов в виде древовидной структуры. Вот еще ряд любопытных ключей (опций) команды ls: -S -- сортировка по размеру файлов, -t -- сортировка по времени последней модификации файла и -i -- выводит список файлов с их inode (см. Пример 12-4).
Пример 12-1. Создание оглавления диска для записи CDR, с помощью команды ls
#!/bin/bash # burn-cd.sh # Сценарий, автоматизирующий процесс прожигания CDR. SPEED=2 # Если ваше "железо" поддерживает более высокую скорость записи -- можете увеличить этот параметр IMAGEFILE=cdimage.iso CONTENTSFILE=contents DEFAULTDIR=/opt # В этом каталоге находятся файлы, которые будут записаны на CD. # Каталог должен существовать. # Используется пакет "cdrecord" от Joerg Schilling. # (http://www.fokus.gmd.de/nthp/employees/schilling/cdrecord.html) # Если этот сценарий предполагается запускать с правами обычного пользователя, #+ то необходимо установить флаг suid на cdrecord #+ (chmod u+s /usr/bin/cdrecord, эта команда должна быть выполнена root-ом). if [ -z "$1" ] then IMAGE_DIRECTORY=$DEFAULTDIR # Каталог по-умолчанию, если иной каталог не задан из командной строки. else IMAGE_DIRECTORY=$1 fi # Создать файл "table of contents". ls -lRF $IMAGE_DIRECTORY > $IMAGE_DIRECTORY/$CONTENTSFILE # Ключ "l" -- "расширенный" формат вывода списка файлов. # Ключ "R" -- рекурсивный обход дерева каталогов. # Ключ "F" -- добавляет дополнительные метки к именам файлов (к именам каталогов добавдяет оконечный символ /). echo "Создано оглавление." # Создать iso-образ. mkisofs -r -o $IMAGFILE $IMAGE_DIRECTORY echo "Создан iso-образ файловой системы ISO9660 ($IMAGEFILE)." # "Прожигание" CDR. cdrecord -v -isosize speed=$SPEED dev=0,0 $IMAGEFILE echo "Запись диска." echo "Наберитесь терпения, это может потребовать некоторого времени." exit 0
cat -- это акроним от concatenate, выводит содержимое списка файлов на stdout. Для объединения файлов в один файл может использоваться в комбинации с операциями перенаправления (> или >>).
# Порядок работы с 'cat' cat filename # Вывод содержимого файла. cat file.1 file.2 file.3 > file.123 # Объединение содержимого 3-х файлов в одном.Ключ -n, команды cat, вставляет порядковые номера строк в выходном файле. Ключ -b -- нумерут только не пустые строки. Ключ -v выводит непечатаемые символы в нотации с символом ^. Ключ -s заменяет несколько пустых строк, идущих подряд, одной пустой строкой.
см. также Пример 12-24 and Пример 12-20.
tac -- выводит содержимое файлов в обратном порядке, от последней строки к первой.
выводит все строки файла задом наперед на stdout. Это не то же самое, что tac. Команда rev сохраняет порядок следования строк, но переворачивает каждую строку задом наперед.
bash$ cat file1.txt Это строка 1. Это строка 2. bash$ tac file1.txt Это строка 2. Это строка 1. bash$ rev file1.txt .1 акортс отЭ .2 акортс отЭ
Команда копирования файлов. cp file1 file2 скопирует file1 в file2, перезаписав file2 если он уже существовал (см. Пример 12-6).
С флагами -a и -r, или -R выполняет копирование дерева каталогов. |
Команда перемещения файла. Эквивалентна комбинации команд cp и rm. Может использоваться для перемещения большого количества файлов или для переименования каталогов. Примеры использования команды mv вы найдете в Пример 9-17 и Пример A-3.
При использовании в неинтерактивных сценариях, команде mv следует передавать ключ -f, чтобы подавить запрос подтверждения на перемещение. Если в качестве каталога назначения указан существующий каталог, то перемещаемый каталог становится подкаталогом каталога назначения.. bash$ mv source_directory target_directory bash$ ls -lF target_directory total 1 drwxrwxr-x 2 bozo bozo 1024 May 28 19:20 source_directory/ |
Удаляет (remove) файл(ы). Ключ -f позволяет удалять даже файлы ТОЛЬКО-ДЛЯ-ЧТЕНИЯ и подавляет запрос подтверждения на удаление.
При попытке удаления файлов, чьи имена начинаются с символа "-" (дефис), команда rm будет давать сообщение об ошибке. bash$ rm -badname rm: invalid option -- b Try `rm --help' for more information. Как вариант можно предложить предварять имена таких файлов точкой-со-слэшем -- "./" (путь к файлу в текущем каталоге, прим. перев.) . bash$ rm ./-badname |
С ключом -r, удалит все файлы в подкаталогах, начиная с текущего. |
Удаляет каталог. Удаляемый каталог не должен содержать файлов, включая "скрытые файлы", [1] иначе каталог не будет удален.
Создает новый каталог, например: mkdir -p project/programs/December создает каталог с заданным именем в требуемом каталоге. Ключ -p позволяет создавать промежуточные родительские каталоги.
Изменяет атрибуты существующего файла (см. Пример 11-11).
chmod +x filename # Делает файл "filename" доступным для исполнения всем пользователям. chmod u+s filename # Устанавливается бит "suid" для "filename". # В результате, любой пользователь сможет запустить "filename" с привилегиями владельца файла. # (Это не относится к файлам-сценариям на языке командной оболочки.)
chmod 644 filename # Выдает право на запись/чтение владельцу файла "filename", и право на чтение # всем остальным # (восьмеричное число).
chmod 1777 directory-name # Выдает право на чтение, запись и исполнение файлов в каталоге, # дополнительно устанавливает "sticky bit". # Это означает, что удалять файлы в этом каталоге могут только владельцы файлов, # владелец каталога и, само собой разумеется, root.
Изменяет атрибуты файла. Эта команда подобна команде chmod, за исключением синтаксиса вызова, и работает исключительно в файловой системе ext2.
Создает ссылку на существующий файл. Позволяет задавать несколько имен одному и тому же файлу и представляет из себя превосходную альтернативу "псевдонимам" (алиасам) (см. Пример 4-6).
Размер файла-ссылки, создаваемого командой ln, имеет длину всего в несколько байт.
Чаще всего команда ln используется с ключом -s, который служит для создания символической (symbolic), или "мягкой" ("soft") ссылки. Без этого флага, команда создает полноценную копию имени файла. С ключом -- только ссылку, указывающую на заданный файл. Дополнительное преимущество ключа -s состоит в том, что он позволяет создавать ссылки на файлы, расположенные в других файловых системах.
Синтаксис команды достаточно прост. Например, команда: ln -s oldfile newfile создаст ссылку, с именем newfile, на существующий файл oldfile,
Если файл с именем newfile уже существует, то он будет удален командой ln. |
Ссылки дают возможность запускать одну и ту же программу или сценарий, использую различные имена. В этом случае программист может предусмотреть свой вариант развития событий для каждого из имен.
Пример 12-2. Здравствуй или Прощай
#!/bin/bash # hello.sh: Говорит "hello" или "goodbye" #+ в зависимости от того под каким именем был вызван сценарий. # Создайте ссылку на этот сценарий: # ln -s hello.sh goodbye # И попробуйте вызвать его под разными именами: # ./hello.sh # ./goodbye HELLO_CALL=65 GOODBYE_CALL=66 if [ $0 = "./goodbye" ] then echo "Пока!" # Можете вставить свой вариант прощания. exit $GOODBYE_CALL fi echo "Привет!" # Можете вставить свой вариант приветствия. exit $HELLO_CALL
Команды доступа к справочным и информационным страницам по системным командам и установленным программам и утилитам. Как правило, страницы info содержат более подробную информацию, чем man.
[1] |
Скрытыми считаются файлы, имена которых начинаются с точки, например, ~/.Xdefaults. Такие файлы не выводятся простой командой ls, и не могут быть удалены командой rm -rf *. Как правило, скрытыми делаются конфигурационные файлы в домашнем каталоге пользователя. |
Назад | В начало документа | Вперед |
Внутренние команды | К началу раздела | Более сложные команды |