Уильям Шоттс - Командная строка Linux. Полное руководство
- Название:Командная строка Linux. Полное руководство
- Автор:
- Жанр:
- Издательство:Питер
- Год:2016
- ISBN:978-5-496-02303-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Шоттс - Командная строка Linux. Полное руководство краткое содержание
Книга Уильяма Шоттса "Командная строка Linux: Полное руководство" представляет обширный обзор «жизни» в командной строке Linux. В отличие от других книг, посвященных одной программе, такой как командный интерпретатор bash, в этой книге автор попытается рассказать, как поладить с интерфейсом командной строки в более широком аспекте. Как он работает? Что можно сделать с его помощью? Как лучше его использовать? Эта книга не об администрировании системы Linux. Эта книга исключительно о Linux.
В книге материал излагается в тщательно выверенной последовательности, как в школе, где учитель руководит вами и направляет вас по правильному пути. Многие авторы грешат тем, что подают материал в «систематическом» порядке, имеющем определенный смысл для писателя, но способном вызывать путаницу у начинающих пользователей. Цель данной книги — познакомить вас с идеологией Unix, которая отличается от идеологии Windows.
Командная строка Linux. Полное руководство - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Чтение файлов в циклах
Команды while и until могут принимать данные со стандартного ввода. Это дает возможность обрабатывать файлы с их помощью. В следующем примере мы выведем содержимое файла distros.txt, созданного в одной из предыдущих глав:
#!/bin/bash
# while-read: чтение строк из файла
while read distro version release; do
printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
$distro \
$version \
$release
done < distros.txt
Чтобы перенаправить файл в цикл, мы поместили оператор перенаправления после инструкции done. Цикл будет вводить поля из указанного файла с помощью read. После ввода каждой строки команда read будет завершаться с кодом 0, пока не достигнет конца файла. В этот момент она вернет ненулевой код завершения, и цикл завершится. Цикл можно также использовать в конвейерах:
#!/bin/bash
# while-read2: чтение строк из файла
sort -k 1,1 -k 2n distros.txt | while read distro version release; do
printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
$distro \
$version \
$release
done
Здесь вывод команды sort передается на стандартный ввод цикла, который выводит поток текста на экран. Но не забывайте, что конвейер выполняет цикл в подоболочке, поэтому после его завершения любые переменные, созданные в цикле, будут потеряны.
Заключительное замечание
После знакомства с циклами и ранее представленными командами ветвления, функциями и последовательностями мы получили представление об основных способах управления потоком выполнения в программах. В арсенале bash имеется еще множество хитрых трюков, но все они основаны на этих простых идеях.
30. Поиск и устранение ошибок
Поскольку наши сценарии становятся все сложнее и сложнее, настало время посмотреть, что случается, когда что-то идет не так и сценарии перестают делать то, что нам нужно. В этой главе мы познакомимся с некоторыми распространенными ошибками, встречающимися в сценариях, и приемами поиска и устранения неисправностей.
Синтаксические ошибки
Один из самых распространенных видов ошибок — синтаксические ошибки. Синтаксические ошибки возникают при неправильном вводе некоторого элемента с нарушением синтаксиса командной оболочки. Чаще всего эти ошибки вызывают отказ командной оболочки от выполнения сценария.
Для демонстрации распространенных видов ошибок в дальнейших обсуждениях мы будем использовать следующий сценарий:
#!/bin/bash
# trouble: сценарий для демонстрации распространенных видов ошибок
number=1
if [ $number = 1 ]; then
echo "Number is equal to 1."
else
echo "Number is not equal to 1."
fi
В текущем своем виде сценарий выполняется без ошибок:
[me@linuxbox ~]$ trouble
Number is equal to 1.
Отсутствующие кавычки
Давайте изменим сценарий, удалив кавычку в конце аргумента первой команды echo:
#!/bin/bash
# trouble: сценарий для демонстрации распространенных видов ошибок
number=1
if [ $number = 1 ]; then
echo "Number is equal to 1.
else
echo "Number is not equal to 1."
fi
Посмотрите, что из этого получилось:
[me@linuxbox ~]$ trouble
./trouble: строка 10: неожиданный EOF при поиске соответствующего `"'
./trouble: строка 13: ошибка синтаксиса: неожиданный конец файла
Командная оболочка сгенерировала два сообщения об ошибках. Обратите внимание, что номера строк в сообщениях не соответствуют номеру строки, где отсутствует кавычка. Понять причину можно, мысленно последовав за программой после отсутствующей кавычки. bash продолжит поиск закрывающей кавычки и найдет ее сразу за второй командой echo. После этого командная оболочка bash очень удивится, обнаружив нарушение синтаксиса команды if, потому что инструкция fi теперь окажется внутри строки в кавычках (незакрытой).
Найти такие ошибки в длинных сценариях порой очень сложно. Хорошую помощь в этом случае может оказать текстовый редактор с подсветкой синтаксиса. Если в системе установлена полная версия редактора vim, подсветка синтаксиса в нем включается командой:
:syntax on
Отсутствующие или неожиданные лексемы
Другая частая ошибка — отсутствие закрывающего элемента в составной команде, такой как if или while. Взгляните, что получится, если убрать точку с запятой после проверки условия в команде if.
#!/bin/bash
# trouble: сценарий для демонстрации распространенных видов ошибок
number=1
if [ $number = 1 ] then
echo "Number is equal to 1."
else
echo "Number is not equal to 1."
fi
При попытке выполнить сценарий мы получим:
[me@linuxbox ~]$ trouble
./trouble: строка 9: ошибка синтаксиса около неожиданной лексемы `else'
./trouble: строка 9: `else'
И снова сообщение об ошибке указывает на место, расположенное гораздо дальше фактического места ошибки. Здесь складывается очень интересная ситуация. Как вы помните, if принимает список команд и проверяет код завершения последней команды в списке. В нашей программе мы задумали список с единственной командой [, которая является синонимом команды test. Команда [ принимает все, что следует за ней, как список аргументов — в данном случае четыре аргумента: $number, =, 1 и ]. В отсутствие точки с запятой в список аргументов будет добавлено слово then, что синтаксически допустимо. Следующая команда echo также допустима. Она интерпретируется как еще одна команда в списке команд, которую if должна выполнить и проверить код завершения. Далее следует неуместное здесь слово else, потому что командная оболочка распознает его как зарезервированное слово (слово, имеющее специальное значение для командной оболочки), а не как имя команды. Это объясняет смысл сообщения об ошибке.
Непредвиденная подстановка
Существуют ошибки, которые возникают лишь время от времени. Иногда сценарий работает без ошибок, а иногда терпит неудачу из-за работы механизма подстановки. Для демонстрации этой проблемы вернем точку с запятой на место и изменим значение переменной number, присвоив ей пустое значение:
#!/bin/bash
# trouble: сценарий для демонстрации распространенных видов ошибок
number=
if [ $number = 1 ]; then
echo "Number is equal to 1."
else
echo "Number is not equal to 1."
fi
При попытке выполнить сценарий после внесения изменений мы получим:
[me@linuxbox ~]$ trouble
./trouble: строка 7: [: =: ожидается использование унарного оператора
Number is not equal to 1.
Мы получили довольно загадочное сообщение, за которым следует вывод второй команды echo. Проблема заключается в подстановке переменной number в команду test. После обработки команды
[ $number = 1 ]
механизмом подстановки, который заменит number пустым значением:
[ = 1 ]
получится недопустимый результат, и командная оболочка сгенерирует сообщение об ошибке. Оператор = является бинарным (он требует наличия двух операндов, по одному с каждой стороны), но первое значение отсутствует, поэтому команда test ожидает встретить унарный оператор (такой, как -z). Далее, поскольку test вернула ненулевой код завершения (из-за ошибки), команда if получит ненулевой код завершения, примет соответствующее решение и выполнит вторую команду echo.
Читать дальшеИнтервал:
Закладка: