Среди операционных систем особое место занимает Unix. Беспрецедентным
является то, что ОС Unix может работать практически на всех
выпускаемых платформах. UNIX - это стандарт де факто открытых и
мобильных операционных систем. (поскольку название UNIX запатентовано
компанией AT&T - различные юниксы называются различно: SCO UNIX,
BSDI, Solaris, Linux, DG/UX, AIX и т.д.).
Это не только многозадачная, но и многопользовательская система. Она обеспечивает современный пользовательский интерфейс на базе системы X Window и межмашинную связь на базе протоколов TCP/IP и т.п.
ОС Unix была создана Кеном Томпсоном и Деннисом Ритчи в Bell Laborotories (AT&T). Широко распространяться Unix/v7 (версия 7) начала в 79 - 80-м годах. Вручение создателям Unix в 1983 году Международной премии А.Тьюринга в области программирования ознаменовало признание этой системы мировой научной (computer science) общественностью. Что также беспрецедентно.
Сколько операционных систем взошло и зашло на компьютерном небосклоне за время существования UNIX!
ОС Unix стоит на трех китах: язык Си, файловая система, командный язык. В дальнейшем к ним добавились система X Window и протоколы TCP/IP.
Язык Си, на котором написана сама операционная система, с одной стороны, сочетает в себе свойства языка высокого уровня: описание типов, программные структуры if, for, while и т.п., а с другой - содержит средства, присущие обычно языкам уровня ассемблера: регистровые переменные, адресную (ссылочную) арифметику, возможности работы с полями бит и отдельными битами и т.п.
Файловая система ОС Unix имеет иерархическую (древовидную) структуру. В вершинах дерева находятся каталоги (используют также термины - справочники, директории), содержащие списки файлов. Эти файлы в свою очередь могут быть либо снова каталогами, либо обычными файлами, либо специальными файлами, представляющими различные устройства ввода-вывода.
А также обычные (выполняемые) файлы:
Полные имена файлов будут: /bin, /usr, ..., /unix, /boot.
В свою очередь эти каталоги могут содержать каталоги следующего уровня. Например, каталог "usr", кроме прочего, содержит каталоги:
полные имена этих файлов будут:
Относительное имя начинается не с "/", и определят имя относительно своего местоположения. Если (пользователь?) в данный момент находится в директории /usr файловой системы, то он может обратиться к этому же файлу по относительному имени
находящегося на ступеньку выше данного на пути к корню).
В качестве имени файла как правило может использоваться любая последовательность из букв, цифр и подчеркиваний. Могут использоваться и другие символы, однако ряд этих символов при использовании в имени требует специального экранирования. (Лучше не пользоваться специальными символами в именах - иногда это может привести к сложностям в обращении к таким именам, поскольку спецсимволы могут иметь в shell некоторый специальный смысл).
В ряде систем длина имени ограничивается 14-ю символами (этого ограничения желательно придерживаться для переносимости файлов), однако в других системах допускаются более длинные имена - например, до 256 символов.
В общем случае не являются обязательными и какие-то расширения в именах. Хотя ряд команд требуют наличия некоторых фиксированных расширений в именах, например расширение ".с" для исходных файлов для Си-компилятора.
КСТАТИ. В ОС UNIX большие и маленькие буквы воспринимаются как различные, поэтому "FILE", "file" и "File" - это три различных имени!
Командный язык ОС Unix - shell оперирует с командами. Более подробно о
нем разговор далее, а пока рассмотрим несколько команд работы с
файловой системой.
Например, в результате выполнения команды
Далее, 2 - это число связей файла (т.е. где-то в системе есть еще одно имя, связанное с этим файлом); root - имя владельца, 2048 - число символов в файле, nov 3 12:11 - дата и время создания или последней модификации файла (3 ноября в 12-11); bin - имя файла (каталог команд).
Во второй строке указан обычный текстовый файл (boot), который прочие пользователи могут только читать.
Команда "pwd" (без флагов и аргументов) сообщает местоположение пользователя в файловой системе. С ее помощью выводится полное имя текущего каталога.
При входе в систему пользователь оказывается в определенной заранее вершине дерева. Пусть, например, это будет каталог "/usr".
Изменить местонахождение можно командой "cd <каталог>". Так можно перейти в каталог /usr/include/sys, набрав команду
Отличительный признак относительного имени - отсутствие символа "/" в начале.
Команда "cd .." осуществит переход вверх на предыдущий уровень. Из "/usr/include/sys" произойдет переход в "/usr/include", а команда "cd" (т.е. без параметров) осуществит переход в начальный директорий пользователя (т.е. директорий, в котором пользователь оказывается при входе в систему).
Создать новые каталоги можно с помощью команды
Удалить пустой (не содержащий файлов) каталог можно с помощью команды
В ОС Unix около 200 базовых команд - инструментальных средств, позволяющих пользователю решать многие свои проблемы, не прибегая к программированию на языках типа Си или использованию специальных пакетов.
Командой
Командой
Командой
Командой
Очень важна команда
Командный язык shell (в переводе - раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой (если угодно - она начинает взаимодействовать с вами). Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар ("$").
Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX [POSIX 1003.2] - стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell (из наиболее популярных в последнее время) и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками.
Так например, если вы подготовите в редакторе файл "f1":
Поскольку UNIX - система многопользовательская, вы можете даже на
персональном компьютере работать параллельно, скажем, на 12-ти экранах
(переход с экрана на экран ALT/функциональная клавиша), имея на каждом
экране нового (или одного и того же) пользователя со своей командной
оболочкой. Можете и в графическом режиме X-Window также открыть
большое число окон, а в каждом окне может быть свой пользователь со
своей командной оболочкой...
Стержневым элементом языка shell является команда.
3.1. Структура команд
Команды в shell обычно имеют следующий формат:
Эта команда выдаст на экран в длинном формате содержимое директория
/usr/bin, при этом добавит информацию о размере каждого файла в
блоках.
К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие "ходовые" команды, как сс, tar, dd, find и ряд других.
Как правило (но не всегда), первое слово (т.е. последовательность символов до пробела, табуляции или конца строки) shell воспринимает, как команду. Поэтому в командной строке
3.2. Группировка команд.
Средства группировки:
При выполнении команды в асинхронном режиме (после команды стоит один
амперсанд) на экран выводится номер процесса, соответствующий
выполняемой команде, и система, запустив этот фоновый процесс, вновь
выходит на диалог с пользователем.
Например, наберем (экзотическую) команду "find" в фоновом режиме для поиска в системе , начиная от корня "/", файла с именем "conf", а затем "pwd" в обычном режиме. На экране этот фрагмент будет выглядеть следующим образом:
Для группировки команд также могут использоваться фигурные "{}" и круглые "()" скобки. Рассмотрим примеры, сочетающие различные способы группировки: Если введена командная строка
Фоновые процессы (как и теневую экономику) сложно уничтожить, поскольку традиционная команда "CTL/C" прерывает только процессы переднего плана. Для уничтожения фонового процесса надо знать его номер. При запуске фонового процесса на экран выдается число, соответствующее номеру (идентификатору) этого процесса (PID). Если этот номер забыт или надо убедиться, что этот процесс не закончен, с помощью команды
В выведенной таблице можно найти номера процессов, подлежащих уничтожению, например это "849" и "866". Тогда командой
Круглые скобки "()", кроме выполнения функции группировки, выполняют и
функцию вызова нового экземпляра интерпретатора shell.
Пусть мы находились в начальном каталоге "/mnt/lab/asu"
Тогда в последовательности команд
3.3. Перенаправление команд
Стандартный ввод (вход) - "stdin" в ОС UNIX осуществляется с клавиатуры терминала, а стандартный вывод (выход) - "stdout" направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений - "stderr", о котором речь будет чуть позже.
Команда, которая может работать со стандартным входом и выходом, называется ФИЛЬТРОМ.
Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы ">" и ">>" обозначают перенаправление вывода.
Символы "<" и "<<" обозначают перенаправление ввода.
Можно сочетать перенаправления. Так
Средство, объединяющее стандартный выход одной команды со стандартным входом другой, называется КОНВЕЙЕРОМ и обозначается вертикальной чертой "|".
Конвейером можно об'единять и более двух команд, когда все они, возможно кроме первой и последней - фильтры:
Поскольку устройства в ОС UNIX представлены специальными файлами, их можно использовать при перенаправлениях. Специальные файлы находятся в каталоге "/dev". Например, "lp" - печать; "console" - консоль; "ttyi" - i-ый терминал; "null" - фиктивный (пустой) файл (устройство).
Тогда, например,
Вернемся к перенаправлению выхода. Стандартные файлы имеют номера: 0 - stdin, 1 - stdout и 2 - stderr. Если вам не желательно иметь на экране сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл (или вообще "выбросить", перенаправив в файл "пустого устройства" - /dev/null). Например при выполнении команды
Если вам не желательно такое сообщение на экране, его можно перенаправить в указанный вами файл:
Конструкция "1>&2" - означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить "&"; вся конструкция пишется без пробелов.
3.4. Генерация имен файлов.
При генерации имен используют метасимволы:
3.5. Командные файлы.
Для того, чтобы текстовый файл можно было использовать как команду, существует несколько возможностей.
Пусть с помощью редактора создан файл с именем "cmd", содержащий одну строку следующего вида:
Более интересный и удобный вариант работы с командным файлом - это превратить его в выполняемый, т.е. просто сделать его командой, что достигается изменением кода защиты. Для этого надо разрешить выполнение этого файла.
Например,
Результат будет тот же, если файл с содержимым
Таким образом, выполняемыми файлами могут быть не только файлы, полученные в результате компиляции и сборки, но и файлы, написанные на языке shell. Их выполнение происходит в режиме интерпретации с помощью shell-интерпретатора
Еще раз отметим, что shell-интерпретатор, это всего лишь одна из сотен команд ОС UNIX, имеющая равные с прочими привилегии.
Это не только многозадачная, но и многопользовательская система. Она обеспечивает современный пользовательский интерфейс на базе системы X Window и межмашинную связь на базе протоколов TCP/IP и т.п.
ОС Unix была создана Кеном Томпсоном и Деннисом Ритчи в Bell Laborotories (AT&T). Широко распространяться Unix/v7 (версия 7) начала в 79 - 80-м годах. Вручение создателям Unix в 1983 году Международной премии А.Тьюринга в области программирования ознаменовало признание этой системы мировой научной (computer science) общественностью. Что также беспрецедентно.
Сколько операционных систем взошло и зашло на компьютерном небосклоне за время существования UNIX!
ОС Unix стоит на трех китах: язык Си, файловая система, командный язык. В дальнейшем к ним добавились система X Window и протоколы TCP/IP.
Язык Си, на котором написана сама операционная система, с одной стороны, сочетает в себе свойства языка высокого уровня: описание типов, программные структуры if, for, while и т.п., а с другой - содержит средства, присущие обычно языкам уровня ассемблера: регистровые переменные, адресную (ссылочную) арифметику, возможности работы с полями бит и отдельными битами и т.п.
Файловая система ОС Unix имеет иерархическую (древовидную) структуру. В вершинах дерева находятся каталоги (используют также термины - справочники, директории), содержащие списки файлов. Эти файлы в свою очередь могут быть либо снова каталогами, либо обычными файлами, либо специальными файлами, представляющими различные устройства ввода-вывода.
/ | ----------------------------------------------------------- | | | | | | | | | | bin boot dev etc lib mnt sys . . . tmp unix usrKорневой каталог имеет имя "/". Он обычно содержит каталоги:
bin | для наиболее используемых команд; |
usr | каталоги и обычные файлы, содержащие информацию, привлекаемую при решении задач пользователя; |
dev | для специальных файлов, представляющих устройства (дисплеи, диски...); |
etc | для хранения файлов конфигурации; |
lib | важнейшие библиотеки; |
mnt | для подключения (примонтирования) новых файловых систем; |
sys | средства для изменения конфигурации системы; |
tmp | для хранения временных файлов; |
usr | каталоги и обычные файлы, содержащие информацию, привлекаемую при решении задач пользователя. |
unix | ядро; |
boot | загрузчик. |
В свою очередь эти каталоги могут содержать каталоги следующего уровня. Например, каталог "usr", кроме прочего, содержит каталоги:
bin | хранит дополнительные команды; |
games | игры; |
include | хранит фрагменты системных программ; |
lib | хранит дополнительные библиотеки. |
/usr/bin /usr/games /usr/include /usr/libЕсли в каталоге "/usr/include" содержится каталог "sys", который в свою очередь, содержит каталог "conf", то полное имя файла "conf" будет
/usr/include/sys/confФормальным признаком полного имени является то, что оно начинается со слэша ("/").
Относительное имя начинается не с "/", и определят имя относительно своего местоположения. Если (пользователь?) в данный момент находится в директории /usr файловой системы, то он может обратиться к этому же файлу по относительному имени
include/sys/confЕсть два специальных имени:
. | это "имя" текущего директория и |
.. | это "имя" родительского директория (т.е. директория, |
В качестве имени файла как правило может использоваться любая последовательность из букв, цифр и подчеркиваний. Могут использоваться и другие символы, однако ряд этих символов при использовании в имени требует специального экранирования. (Лучше не пользоваться специальными символами в именах - иногда это может привести к сложностям в обращении к таким именам, поскольку спецсимволы могут иметь в shell некоторый специальный смысл).
В ряде систем длина имени ограничивается 14-ю символами (этого ограничения желательно придерживаться для переносимости файлов), однако в других системах допускаются более длинные имена - например, до 256 символов.
В общем случае не являются обязательными и какие-то расширения в именах. Хотя ряд команд требуют наличия некоторых фиксированных расширений в именах, например расширение ".с" для исходных файлов для Си-компилятора.
КСТАТИ. В ОС UNIX большие и маленькие буквы воспринимаются как различные, поэтому "FILE", "file" и "File" - это три различных имени!
Важное Замечание. Отдельные части файловой системы могут
находиться на различных физических устройствах, например, на
нескольких жестких и гибких дисках (или в различных частях
одного диска). Соответствующие фрагменты (поддеревья файловой системы) монтируются (присоединяются) в единую файловую систему командой mount (обычно это функция администратора системы), после чего пользователь может обращаться к любым доступным файлам, при этом в имени никак не отражается устройство, на котором файл находится или создается (т.е. никаких "A:"). |
Например, в результате выполнения команды
ls -l /usrгде ls - имя команды; -l - флаг, говорящий о том, что выдача должна быть в длинном формате; /usr -имя каталога, который надо echo. На экран будет выведено
drwxrwxr-x 2 root 2048 nov 3 12:11 bin -rwxr--r-- 1 root 861 may 11 20:11 boot drwxrwxr-x 2 root 1024 jan 9 11:55 dev drwxrwxr-x 1 root 4096 may 11 20:11 dos drw-r--r-- 3 root 4096 nov 17 12:01 include drwxr-xr-x 7 root 480 nov 17 12:30 libПервая строка означает, что это каталог (d-directory), где первая триада "rwx" разрешает владельцу каталога: r - читать, w - писать и х - выполнять (более точно, для файлов типа каталог w означает разрешение создавать файлы в каталоге и удалять их из него, а х разрешает доступ к файлам каталога); членам группы, в которую входит владелец, также разрешены все три операции. Последняя триада отражает права доступа прочих пользователей, которым разрешено только читать и выполнять (запрещено писать в этот файл, т.е. изменять содержимое каталога).
Далее, 2 - это число связей файла (т.е. где-то в системе есть еще одно имя, связанное с этим файлом); root - имя владельца, 2048 - число символов в файле, nov 3 12:11 - дата и время создания или последней модификации файла (3 ноября в 12-11); bin - имя файла (каталог команд).
Во второй строке указан обычный текстовый файл (boot), который прочие пользователи могут только читать.
Команда "pwd" (без флагов и аргументов) сообщает местоположение пользователя в файловой системе. С ее помощью выводится полное имя текущего каталога.
При входе в систему пользователь оказывается в определенной заранее вершине дерева. Пусть, например, это будет каталог "/usr".
Изменить местонахождение можно командой "cd <каталог>". Так можно перейти в каталог /usr/include/sys, набрав команду
cd /usr/include/sysздесь указано полное имя , или
cd include/sysздесь указано относительное имя.
Отличительный признак относительного имени - отсутствие символа "/" в начале.
Команда "cd .." осуществит переход вверх на предыдущий уровень. Из "/usr/include/sys" произойдет переход в "/usr/include", а команда "cd" (т.е. без параметров) осуществит переход в начальный директорий пользователя (т.е. директорий, в котором пользователь оказывается при входе в систему).
Создать новые каталоги можно с помощью команды
mkdir <имена создаваемых каталогов>Так команда "mkdir err new" создаст в данном каталоге два новых каталога с относительными именами "err" и "new".
Удалить пустой (не содержащий файлов) каталог можно с помощью команды
rmdir <имена удаляемых каталогов>Удалить обычный файл можно командой
rm <имена удаляемых файлов>Наиболее естественный для пользователя способ создания файлов - это использование текстового редактора "ed" или экранного редактора "red" (а также стандартных "vi" и "ех", или многочисленных прочих "фирменных").
В ОС Unix около 200 базовых команд - инструментальных средств, позволяющих пользователю решать многие свои проблемы, не прибегая к программированию на языках типа Си или использованию специальных пакетов.
Командой
rm файл-1можно удалить "файл-1".
Командой
rmdir файл-1можно удалить "файл-1", если это директорий, причем пустой (т.е. не содержит файлов).
Командой
mv старое-имя новое-имяможно переназвать файл.
Командой
cp старое-имя новое-имяможно скопировать файл (сохранив также старый).
Очень важна команда
chmod 755 расчеткоторая превращает файл "расчет", подготовленный в редакторе, в командный, иначе "расчет" при попытке вызова не будет выполнятся. Набор цифр здесь соответствует триадам двоичных представлений восьмеричных чисел и триадам прав доступа к файлам (rwx - чтение, запись, выполнение). То есть определяет, что создатель расчета может не только выполнить или распечатать текст этого расчета, но и вносить в него изменения (7:111 - rwx). А члены группы и прочие пользователи могу только читать и выполнять, но не могут изменять этот расчет (55:101101 - r-xr-x).
Командный язык shell (в переводе - раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой (если угодно - она начинает взаимодействовать с вами). Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар ("$").
Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX [POSIX 1003.2] - стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell (из наиболее популярных в последнее время) и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками.
Обратите внимание: shell - это одна из многих команд UNIX. То есть в набор команд оболочки (интерпретатора) "shell" входит команда "sh" - вызов интерпретатора "shell". Первый "shell" вызывается автоматически при вашем входе в систему и выдает на экран промтер. После этого вы можете вызывать на выполнение любые команды, в том числе и снова сам "shell", который вам создаст новую оболочку внутри прежней. |
echo Hello!то это будет обычный текстовый файл, содержащий команду "echo", которая при выполнении выдает все написанное правее ее на экран. Можно сделать файл "f1" выполняемым с помощью команды "chmod 755 f1". Но его можно ВЫПОЛНИТЬ, вызвав явно команду (!) "sh" ("shell"):
sh f1или
sh < f1Файл можно выполнить и в текущем экземпляре "shell". Для этого существует специфическая команда "." (точка), т.е.
. f1
Важное предупреждение: Не начинайте командные файлы с символа
"#", хотя естественно начинать его с комментария. Дело в том,
что такой командный файл в оболочке C-Shell ("csh") будет
интерпретирован как выполняемый в "csh", в результате будет
активизирован. интерпретатор "csh".
СОВЕТ. Начинайте командный sh-файл с пустой строки или
пустого оператора ":".
|
Стержневым элементом языка shell является команда.
3.1. Структура команд
Команды в shell обычно имеют следующий формат:
<имя команды> <флаги> <аргумент(ы)>Например:
ls -ls /usr/bin
ls | имя команды выдачи содержимого директория, |
-ls | флаги ( "-" - признак флагов, l - длинный формат, s - об'ем файлов в блоках). |
/usr/bin | директорий, для которого выполняется команда. |
К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие "ходовые" команды, как сс, tar, dd, find и ряд других.
Как правило (но не всегда), первое слово (т.е. последовательность символов до пробела, табуляции или конца строки) shell воспринимает, как команду. Поэтому в командной строке
cat catпервое слово будет расшифровано shell, как команда (конкатенации), которая выдаст на экран файл с именем "cat" (второе слово), находящийся в текущем директории.
3.2. Группировка команд.
Средства группировки:
;и <перевод строки> |
определяют последовательное выполнение команд; |
& | асинхронное (фоновое) выполнение предшествующей команды; |
&& | выполнение последующей команды при условии нормального завершения предыдущей, иначе игнорировать; |
|| | выполнение последующей команды при ненормальном завершении предыдущей, иначе игнорировать. |
Например, наберем (экзотическую) команду "find" в фоновом режиме для поиска в системе , начиная от корня "/", файла с именем "conf", а затем "pwd" в обычном режиме. На экране этот фрагмент будет выглядеть следующим образом:
-------------------------------- | $ find / -name conf -print & | ввод команды "find" | | | 288 | номер (PID) фонового процесса | | | $ pwd | ввод команды "pwd" | | | /mnt/lab/asu | результат работы "pwd" | | | $ | возвращение shell в промптер | | | /usr/include/sys/conf | результат работы "find" | | --------------------------------Иногда необходимо, чтобы все фоновые процессы завершились, прежде чем будет выполняться какой-то расчет. Для этого служит специальная команда "wait [PID]". Эта команда ждет завершения указанного идентификатором (числом) фонового процесса. Если команда без параметра, то она ждет завершения всех фоновых процессов, дочерних для данного "sh".
Для группировки команд также могут использоваться фигурные "{}" и круглые "()" скобки. Рассмотрим примеры, сочетающие различные способы группировки: Если введена командная строка
k1 && k2; k3где k1, k2 и k3 - какие-то команды, то "k2" будет выполнена только при успешном завершении "k1"; после любого из исходов обработки "k2" (т.е. "k2" будет выполнена, либо пропущена) будет выполнена "k3".
k1 && {k2; k3}Здесь обе команды ("k2" и "k3") будут выполнены только при успешном завершении "k1".
{k1; k2} &В фоновом режиме будет выполняться последовательность команд "k1" и "k2".
Фоновые процессы (как и теневую экономику) сложно уничтожить, поскольку традиционная команда "CTL/C" прерывает только процессы переднего плана. Для уничтожения фонового процесса надо знать его номер. При запуске фонового процесса на экран выдается число, соответствующее номеру (идентификатору) этого процесса (PID). Если этот номер забыт или надо убедиться, что этот процесс не закончен, с помощью команды
ps -auxможно получить перечень идентификаторов процессов (PID), имена пользователей, текущее время, затраченное процессами, и т.д.
В выведенной таблице можно найти номера процессов, подлежащих уничтожению, например это "849" и "866". Тогда командой
kill -9 866 849можно уничтожить эти процессы. При уничтожении процессов надо вы должны иметь то же имя пользователя, какое было приписано уничтожаемым процессам (или иметь имя привилегированного пользователя).
Предупреждение: Если параллельно обрабатывается или создается файл с ОДНИМ именем (например, несколько пользователей вызвали в редактор один и тот же файл), то в системе продолжит существование тот вариант файла, который возвращен (записан) в систему последним. Это частая ошибка пользователей персональных компьютеров, которые редактируют один файл параллельно с нескольких экранов. |
Пусть мы находились в начальном каталоге "/mnt/lab/asu"
Тогда в последовательности команд
cd ..; ls; lsдве команды "ls" выдадут 2 экземпляра содержимого каталога "/mnt/lab", а последовательность
(cd ..; ls) lsвыдаст сначала содержимое каталога "/mnt/lab", а затем содержимое "/mnt/lab/asu", т.к. при входе в скобки вызывается новый экземпляр shell, в рамках которого и осуществляется переход. При выходе из круглых скобок происходит возврат в старый shell и в старый каталог.
3.3. Перенаправление команд
Стандартный ввод (вход) - "stdin" в ОС UNIX осуществляется с клавиатуры терминала, а стандартный вывод (выход) - "stdout" направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений - "stderr", о котором речь будет чуть позже.
Команда, которая может работать со стандартным входом и выходом, называется ФИЛЬТРОМ.
Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы ">" и ">>" обозначают перенаправление вывода.
ls >f1команда "ls" сформирует список файлов текущего каталога и поместит его в файл "f1" (вместо выдачи на экран). Если файл "f1" до этого существовал, то он будет затерт новым.
pwd >>f1команда pwd сформирует полное имя текущего каталога и поместит его в конец файла "f1", т.е. ">>" добавляет в файл, если он непустой.
Символы "<" и "<<" обозначают перенаправление ввода.
wc -l <f1подсчитает и выдаст на экран число строк в файле f1.
ed f2 <<!создаст с использованием редактора файл "f2", непосредственно с терминала. Окончание ввода определяется по символу, стоящему правее "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!".
Можно сочетать перенаправления. Так
wc -l <f3 >f4 и wc -l >f4 <f3выполняются одинаково: подсчитывается число строк файла "f3" и результат помещается в файл "f4".
Средство, объединяющее стандартный выход одной команды со стандартным входом другой, называется КОНВЕЙЕРОМ и обозначается вертикальной чертой "|".
ls | wc -lсписок файлов текущего каталога будет направлен на вход команды "wc", которая на экран выведет число строк каталога.
Конвейером можно об'единять и более двух команд, когда все они, возможно кроме первой и последней - фильтры:
cat f1 | grep -h result | sort | cat -b > f2Данный конвейер из файла "f1" ("cat") выберет все строки, содержащие слово "result" ("grep"), отсортирует ("sort") полученные строки, а затем пронумерует ("cat -b") и выведет результат в файл "f2".
Поскольку устройства в ОС UNIX представлены специальными файлами, их можно использовать при перенаправлениях. Специальные файлы находятся в каталоге "/dev". Например, "lp" - печать; "console" - консоль; "ttyi" - i-ый терминал; "null" - фиктивный (пустой) файл (устройство).
Тогда, например,
ls > /dev/lpвыведет содержимое текущего каталога на печать, а f1 < /dev/null обнулит файл "f1".
sort f1 | tee /dev/lp | tail -20В этом случае будет отсортирован файл "f1" и передан на печать, а 20 последних строк также будут выданы на экран.
Вернемся к перенаправлению выхода. Стандартные файлы имеют номера: 0 - stdin, 1 - stdout и 2 - stderr. Если вам не желательно иметь на экране сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл (или вообще "выбросить", перенаправив в файл "пустого устройства" - /dev/null). Например при выполнении команды
cat f1 f2которая должна выдать на экран последовательно содержимое файлов "f1" и "f2", выдаст вам, например, следующее
111111 222222 cat: f2: No such file or directoryгде 111111 222222 - содержимое файла "f1", а файл "f2" отсутствует, о чем команда "cat" выдала сообщение в стандартный файл диагностики, по умолчанию, как и стандартный выход, представленный экраном.
Если вам не желательно такое сообщение на экране, его можно перенаправить в указанный вами файл:
cat f1 f2 2>f-errсообщения об ошибках будут направляться (об этом говорит перенаправление "2>") в файл "f-err". Кстати, вы можете всю информацию направлять в один файл "ff", использовав в данном случае конструкцию
cat f1 f2 >>ff 2>ffМожно указать не только какой из стандартных файлов перенаправлять, но и в какой стандартный файл осуществить перенаправление.
cat f1 f2 2>>ff 1>&2Здесь сначала "stderr" перенаправляется (в режиме добавления) в файл "ff", а затем стандартный выход перенаправляется на "stderr", которым к этому моменту является файл "ff". То есть результат будет аналогичен предыдущему.
Конструкция "1>&2" - означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить "&"; вся конструкция пишется без пробелов.
<- | закрывает стандартный ввод. |
>- | закрывает стандартный вывод. |
3.4. Генерация имен файлов.
При генерации имен используют метасимволы:
* | произвольная (возможно пустая) последовательность символов; |
? | один произвольный символ; |
[...] | любой из символов, указанных в скобках перечислением и/или с указанием диапазона; |
cat f* | выдаст все файлы каталога, начинающиеся с "f"; |
cat *f* | выдаст все файлы, содержащие "f"; |
cat program.? | выдаст файлы данного каталога с однобуквенными расширениями, скажем "program.c" и "program.o", но не выдаст "program.com"; |
cat [a-d]* | выдаст файлы, которые начинаются с "a", "b", "c", "d". Аналогичный эффект дадут и команды "cat [abcd]*" и "cat [bdac]*". |
3.5. Командные файлы.
Для того, чтобы текстовый файл можно было использовать как команду, существует несколько возможностей.
Пусть с помощью редактора создан файл с именем "cmd", содержащий одну строку следующего вида:
date; pwd; lsМожно вызвать shell как команду (!), обозначаемую "sh", и передать ей файл "cmd", как аргумент или как перенаправленный вход, т.е.
$ sh cmd или $ sh <cmdВ результате выполнения любой из этих команд будет выдана дата, затем имя текущего каталога, а потом содержимое каталога.
Более интересный и удобный вариант работы с командным файлом - это превратить его в выполняемый, т.е. просто сделать его командой, что достигается изменением кода защиты. Для этого надо разрешить выполнение этого файла.
Например,
chmod 711 cmdсделает код защиты "rwx__x__x". Тогда простой вызов
cmdприведет к выполнению тех же трех команд.
Результат будет тот же, если файл с содержимым
date; pwd; lsпредставлен в виде:
date pwd lsтак как переход на другую строку также является разделителем в последовательности команд.
Таким образом, выполняемыми файлами могут быть не только файлы, полученные в результате компиляции и сборки, но и файлы, написанные на языке shell. Их выполнение происходит в режиме интерпретации с помощью shell-интерпретатора
Еще раз отметим, что shell-интерпретатор, это всего лишь одна из сотен команд ОС UNIX, имеющая равные с прочими привилегии.
Комментариев нет:
Отправить комментарий