Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на shell и awk

  Все выпуски  

О значении точек


Информационный Канал Subscribe.Ru

Выпуск #8

Поздравляю прекрасную «половину» нашей рассылки
с замечательным революционным праздником
Международным женским днем!!!

О значении точек

В UNIX есть одна ловушка, в которую наверно попадали, попадают и будут попадать почти все, до тех пор пока будет жива командная строка ДОС/Виндовс. Доводилось ли вам сталкиваться с чем-то подобным:
$ ls -l
-rwxr-xr-x    1 root     root         4330 Aug 30 18:00 mycmd

$ mycmd
-bash: mycmd: command not found
                                                              Пример 8.1

Чтобы понять почему shell «нагло отказывается» выполнить команду, а точнее не находит ее, когда как ls и мы ненапрягаясь видим ее невооруженным глазом, необходимо разобраться в том, где командный интерпретатор пытается отыскать и затем выполнить команду, введеную просто по имени. В ДОС/Виндовс command.com и cmd.exe пытаются сначала отыскать ее в текущем каталоге. Если этой команды там нет, то ее ищут в каталогах, перечисленных в переменной PATH. Если команда отсутствует и в них, то выводится сообщение об ошибке «bad command or file name». В UNIX же командный интерпретатор сразу приступает к поиску команды в каталогах из переменной PATH.

С учетом вышесказанного и после вывода значений переменной PATH и текущего каталога:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

$ pwd
/root
                                                              Пример 8.2

становиться ясно, почему командный интерпретатор не находит введенную команду, в то время как ls показывает, что она существует.

Как же быть? Как быть? Как программу запустить? Раз текущего каталога в переменной PATH нет, то его нужно указывать явно. Однако, это не значит, что вам придется указыват полное путевое имя перед именем команды, например /root/mycmd. Зная, что для обозначения текущего каталога используется символ точки, вам достаточно написать:

$ ./mycmd
Ok
                                                              Пример 8.3

Будьте бдительны!
Из соображений безопасности категорически не рекомендуется помещать точку в переменную PATH. Если вы не прислушаетесь к этому совету и поступите наоборот, то пожалуйста постарайтесь разместить обозначение текущего каталога последним в списке.

Если просматривать содержимое каталогов командой ls с опцией -a, которая заставляет ls выводить информацию о всех файлах (по умолчанию ls не отображает файлы, чьи имена начинаются с точки):

$ ls -al
total 204
drwxr-x---    6 root     root         4096 Feb 26 15:21 .
drwxr-xr-x   21 root     root         4096 Feb 28 15:40 ..
-rw-r--r--    1 root     root         2815 Feb 10 13:33 anaconda-ks.cfg
-rw-------    1 root     root        12564 Feb 28 13:03 .bash_history
-rw-r--r--    1 root     root           24 Jun 11  2000 .bash_logout
-rw-r--r--    1 root     root          234 Jul  5  2001 .bash_profile
-rw-r--r--    1 root     root          176 Aug 23  1995 .bashrc
drwx------    2 root     root         4096 Feb 11 12:26 .cedit
-rw-r--r--    1 root     root          210 Jun 11  2000 .cshrc
 ...
                                                              Пример 8.4
то окажется, что в любом каталоге всегда присутствуют два специальных файла: . и .. . О первом я уже рассказывал, что он соответствует текущему каталогу:
$ ls -dil . `pwd`
  63613 drwxr-x---    6 root     root         4096 Feb 26 15:21 .
  63613 drwxr-x---    6 root     root         4096 Feb 26 15:21 /root
                                                              Пример 8.5
Обратите внимание в вышеприведенном примере на то, что номера индексных дескрипторов (первое поле вывода команды ls) текущего каталога и файла . одинаковы. Этот факт объясняет почему у каталогов значение счетчика связей (третье поле) меньше двух не бывает.

Что же тогда обозначают, указанные одна за одной, две точки? Это имя ссылки на родительский каталог (он же каталог верхнего уровня). Следующий пример демонстрирует, что при создании подкаталога в каталоге /tmp/dir значение счетчика связей для последнего каждый раз увеличивается на единицу:

$ cd /tmp
$ mkdir dir
$ ls -dil dir dir/.
 163409 drwxr-xr-x    2 root     root         4096 Mar  8 13:47 dir
 163409 drwxr-xr-x    2 root     root         4096 Mar  8 13:47 dir/.

$ mkdir dir/dir1
$ ls -dil dir dir/. dir/dir?/.
 163409 drwxr-xr-x    3 root     root         4096 Mar  8 13:47 dir
 163409 drwxr-xr-x    3 root     root         4096 Mar  8 13:47 dir/.
 163409 drwxr-xr-x    3 root     root         4096 Mar  8 13:47 dir/dir1/.

$ mkdir dir/dir2
$ ls -dil dir dir/. dir/dir?/.
 163409 drwxr-xr-x    4 root     root         4096 Mar  8 13:47 dir
 163409 drwxr-xr-x    4 root     root         4096 Mar  8 13:47 dir/.
 163409 drwxr-xr-x    4 root     root         4096 Mar  8 13:47 dir/dir1/.
 163409 drwxr-xr-x    4 root     root         4096 Mar  8 13:47 dir/dir2/.
                                                               Пример 8.6
Если вам не понятно значение вопросительного знака в записи типа dir/dir?/, то вы узнаете о нем в следующем выпуске рассылки. И еще один, ненуждающийся в комментариях, пример:
$ pwd
/usr/local/bin

$ cd ./.

$ pwd
/usr
                                                               Пример 8.7

Кроме того, точка является встроенной командой shell:

. файл [аргументы]

Она читает и выполняет команды из указанного файла в среде текущего командного интерпретатора. Искомый файл не обязательно должен быть выполняемым. Если указаны аргументы, то они становятся позиционными параметрами при обработке файла.

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

Например, команду .  /etc/init.d/functions вы найдете в начале любого старт-стопного сценария дистрибутива RedHat Linux. Указаный после точки файл содержит в себе определения различных функций командного интерпретатора. Среди них будут и те, что отвечают за вывод статусных сообщений типа:

Инициализация устройства такого-то
Проверка чего-то
Старт службы такой-то
[   OK   ]
[ PASSED ]
[ FAILED ]

Вы их наверное не раз видели.


Подсказка для тех, кто еще не побывал на «Иероглифе» (http://hiero.ru). Зарегистрировавшись на нем, вы получите возможность складывать в «личный альбом» понравившиеся вам работы. Мой альбом, например, доступен по адресу http://hiero.ru/works.php?fav=1&author=bs.


Ведущий рассылки Big Shadow

Архив рассылки находится на http://subscribe.ru/archive/comp.soft.prog.shellandawk/



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное