Приемы профессиональной работы в UNIX


ПОЯСНЕНИЯ - часть 2


./dir ./dir/file1 ./dir/file2

Это относительная нотация, которая очень полезна, когда вы не хо тите, чтобы ваши файлы передавались согласно абсолютным маршрутным именам, но хотим сохранить их взаимосвязь друг с другом. Если на них ссылаться относительно точки, то место, куда они будут помещены, может быть, где угодно. Однако, если мы скажем "find /dir -print", список будет выглядеть так:

/dir /dir/file1 /dir/file2

В обоих случаях мы ссылаемся на наш текущий каталог, но применение записи вида /dir заставляет полное имя начинаться с "/" и не допускает использование относительной нотации. Передача такой же информации команде cpio может радикально изменить место размещения ваших файлов. Например, если я сказал "cd /src; find . -print | cpio -pdv /dest", результирующий список будет таким:

/dest/./dir /dest/./dir/file1 /dest/./dir/file2

где на первом месте стоит, вероятно, то, что вы хотели. Однако, если я сказал "find /src -print | cpio -pdv /dest", результирующие маршрутные имена будут такими:

/dest/src/dir /dest/src/dir/file1 /dest/src/dir/file2

что не очень хорошо, поскольку это создает уровень каталога, в котором нет необходимости. Заметьте, что имя каталога "src" было перехвачено при распечатке. Это произошло потому, что его выдал find, а cpio считает, что src было частью имени каталога-приемника.

Повсеместное использование относительной нотации может привести нас к потере уже имеющейся информации. Например, если бы я сказал "cd/nowhere; find /src ....", каталог-приемник получил бы неверное имя. Мыдолжны уметь использовать этот тип нотации и не попадать в ловушки синтаксиса. Это и есть то, что делает cptdir.

В строке 31 производится проверка на то, является ли первый символ в маршрутном имени целевого каталога символом "косая черта" ("/"). Еслида, то мы точно знаем, что имя каталога-приемника выражено в виде абсолютного маршрутного имени, поэтому мы можем сменить каталоги без потери информации о нашем текущем каталоге. В строках 32-33 мы переходим в каталог-источник и копируем файлы.

Но если первый символ каталога-приемника НЕ является наклонной чертой, используемая нотация является относительной. Это значит, что если мы сменим каталог, мы потеряем информацию о том, где мы находились, когда был запущен командный файл. Чтобы избежать этого, мы получаем в строке 34 полное имя текущего каталога путем перехвата вывода команды pwd и присвоения этого значения переменной таким образом, что позже мы сможем ее восстановить. Затем мы переходим в каталог-источники копируем файлы, используя префикс абсолютного маршрутного имени от команды pwd и относительный суффикс того места, где мы находимся.

Причиной того, что мы так поступаем, является использование относительной (точечной) нотации в операторе find. Как можно было видеть в предыдущем описании, отказ от использования точечной нотации может привести к путанице в маршрутных именах каталога-приемника. Для того чтобы всегда использовать точку в операторе find, нам необходимо убедиться, куда мы собираемся пересылать файлы. Еще раз напомним, что команда cd действует только для данного командного процессора "низкого" уровня, поэтому она не влияет на тот командный процессор, который запустил командный файл. Вообще, командный файл должен оставить пользователей в тех же условиях, в которых они находились перед его запуском, за исключением выполнения необходимых работ, при которых не производится смена текущего каталога.

Когда cptdir завершается, управление возвращается вызывающему командному процессору, который по-прежнему ведет свой собственный текущий каталог. Напомним, что всегда, когда вы переходите на более низкий уровень командного процессора, экспортируемые переменные передаются вниз, но НИЧЕГО не передается наверх.




Начало  Назад  Вперед



Книжный магазин