:/usr/you/bin:/bin:/usr/bin:/usr/games
Сейчас PATH изменилось
$
Можно использовать оба средства в одном командном файле. Вы можете несколько видоизменить команду games
для запуска одной игровой программы без изменения переменной PATH
или постоянно переопределять PATH
, чтобы она включала /usr/games
:
$ cat /usr/you/bin/games
PATH=$PATH:/usr/games $*
Обратите внимание на $*
$ cx /usr/you/bin/games
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin
/usr/games не входит
$ games fortune
Готов отдать свою правую руку, чтобы одинаково владеть обеими
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin
Все еще не входит
$ . games
$ echo $PATH
:/usr/you/bin:/bin:/usr/bin:/usr/games
Теперь входит
$ fortune
Тот, кто медлит, иногда спасается
$
При первом обращении к games командный файл выполняется в порожденном интерпретаторе, в котором переменная PATH
временно изменена так, чтобы включать каталог /usr/games
. В то же время во втором примере файл обрабатывается текущим интерпретатором при значении $*
, являющемся пустой строкой, поэтому в строке нет команд и переменная PATH
изменяется. Применение команды games
в обоих случаях достаточно нетривиально, но в результате получаем удобное и естественное для использования средство.
Для того чтобы значение переменной было доступно в порожденном интерпретаторе, следует использовать команду export
языка shell
. (Вы можете поразмышлять о том, почему нет возможности экспортировать значение переменной от порожденного интерпретатора к порождающему его.) Приведем один из рассмотренных выше примеров, но теперь с экспортом переменной:
$ x=Hello
$ export x
$ sh
Новый интерпретатор
$ echo $x
Hello
x доступно в порожденном интерпретаторе
$ x='Good Bye'
Изменим значение x
$ echo $x
Good Bye
$ ctl-d
Выйдем из порожденного интерпретатора
$
Снова в исходном интерпретаторе
$ echo $x
Hello
x по-прежнему Hello
$
Семантика команды export
нетривиальна, но по крайней мере для повседневных нужд достаточно придерживаться основного правила: никогда не экспортируйте временные переменные, служащие для краткосрочных целей, и всегда экспортируйте переменные, необходимые вам во всех порожденных интерпретаторах (включая, например, интерпретаторы, запускаемые командой !
редактора ed
). Поэтому переменные, имеющие специальное значение для интерпретатора, такие, как PATH
и НОМЕ
, следует экспортировать.
Почему в значение переменной PATH
всегда включается текущий каталог? Куда его нужно поместить?
3.7 Еще раз о переключении ввода-вывода
Понятие стандартного потока диагностики было введено для того, чтобы сообщения об ошибках всегда появлялись на терминале:
$ diff file1 file2 >diff.out
diff: file2: No such file or directory
$
Без сомнения, сообщения об ошибке должны появляться подобным образом — было бы крайне неприятно, если бы они исчезли в файле diff.out
, оставляя вас в уверенности, что ошибочная команда diff
выполнена правильно.
В начале выполнения каждой программы определены по умолчанию три файла, обозначаемые небольшими целыми числами и называемые
Иногда программы осуществляют вывод в стандартный поток диагностики, даже если они работают правильно. Типичным примером является программа time, которая выполняет команду и выдает в стандартный поток диагностики сообщение о том, сколько времени заняло выполнение:
$ time wc ch3.1
931 4288 22691 ch3.1
real 1.0
user 0.4
sys 0.4
$ time wc ch3.1 >wc.out
real 2.0
user 0.4
sys 0.3
$ time wc ch3.1 >wc.out 2>time.out
$ cat time.out
real 1.0
user 0.4
sys 0.3
$
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии