Есть еще один способ установить значение переменной в порожденном интерпретаторе — присвоить его явно в командной строке перед самой командой:
$ echo 'echo $x' >echox$ cx echox$ echo $xHello x не определено в порожденном интерпретаторе
$ x=Hi echoxHi $(Первоначально присваивания всюду в командной строке передавались команде, но это противоречило
dd(1)Операцию
'.'/usr/gamesPATH$ ls /usr/games | grep fortfortune$ fortunefortune: not found$ echo $PATH:/usr/you/bin:/bin:/usr/bin$ PATH=/usr/games fortuneПозвони в звонок; закрой книгу; задуй свечу.$ echo $PATH:/usr/you/bin:/bin:/usr/bin $ cat /usr/you/bin/games $ . games$ fortuneНепродуманная оптимизация - источник всех бед - Кнут$ echo $PATH:/usr/you/bin:/bin:/usr/bin:/usr/games$Можно использовать оба средства в одном командном файле. Вы можете несколько видоизменить команду
gamesPATHPATH/usr/games$ cat /usr/you/bin/gamesPATH=$PATH:/usr/games $* $ cx /usr/you/bin/games$ echo $PATH:/usr/you/bin:/bin:/usr/bin $ 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$*PATHgamesДля того чтобы значение переменной было доступно в порожденном интерпретаторе, следует использовать команду
exportshell$ x=Hello$ export x$ sh $ echo $xHello $ x='Good Bye' $ echo $xGood Bye$ ctl-d $ $ echo $xHello $Семантика команды
export!edPATHНОМЕПочему в значение переменной
PATH3.7 Еще раз о переключении ввода-вывода
Понятие стандартного потока диагностики было введено для того, чтобы сообщения об ошибках всегда появлялись на терминале:
$ diff file1 file2 >diff.outdiff: file2: No such file or directory$Без сомнения, сообщения об ошибке должны появляться подобным образом — было бы крайне неприятно, если бы они исчезли в файле
diff.outdiffВ начале выполнения каждой программы определены по умолчанию три файла, обозначаемые небольшими целыми числами и называемые дескрипторами файла (мы рассмотрим их в гл. 7). Со стандартными входным (0) и выходным (1) потоками вы уже знакомы: они часто переключаются на файл или программный канал. Последний поток с номером 2 представляет собой стандартный поток диагностики и обычно предназначается для вывода на терминал.