Секция 2.

Использование командной строки.

Эта секция охватывает материал темы 1.103.1 для нижнего уровня администрирования (LPIC-1) экзамен 101. Тема имеет максимальную оценку 5.

В этой секции, вы изучите следующие темы:

    Взаимодействие с оболочками и командами, использующими командную строку. Имеющие силу команды и последовательности команды. Определение, ссылка, и переменные окружающей среды. Команда «История» и редактирование средств обслуживания. Команды «Призыва» в дорожке и вне дорожки. Использование команды «Замена». Применение команд рекурсивно через директивное дерево. Использование руководства, чтобы выяснить о командах

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

bash это очень богатая среда, и мы поощряем вас, в стремлении исследовать её далее.

Существует много превосходных книг посвященных UNIX, оболочкам Linux и bash оболочкам в особенности.

Оболочка shell

Оболочка shell - одна из нескольких оболочек, доступных для Linux. Она также называется Bourne-again shell, в честь Стивена Боурн, создателя более ранней оболочки (/bin/sh).

Shell оболочка существенно совместима с sh, но в её состав входят более усовершенствованные функции и способность программирования. Эти особенности включаются в оболочку Korn(Ksh) и оболочку C (csh), и предназначенные, чтобы быть POSIX-compliant shell.

Прежде, чем мы углубимся в изучение оболочки, вспомним, что оболочка это программа, которая принимает и выполняет команды. Она также поддерживает программирование, строит разрешенный комплекс команд, который будет построен из меньших частей. Эти сложные команды, или скрипты, могут быть сохранены как файлы, чтобы стать новыми командами в их собственных правах.

НЕ нашли? Не то? Что вы ищете?

Действительно, многие команды на типичной Linux системе это скрипты.

Оболочки имеют некоторые встроенные команды, типа cd, break и exec. Другие команды являются внешними.

Оболочки также используют три стандартных потока ввода - вывода:

    Stdin – стандартный поток входа, который обеспечивает вход к командам. Stdout – стандартный поток выхода, который показывает поток от команды. Stderr – стандартный поток ошибки, который показывает поток ошибки от команды.

Потоки входа обеспечивают вход к программам, обычно от терминала keystrokes.

Поток печатает текстовые характеристики, обычно на терминал. Терминалом служила первоначально пишущая машинка ASCII или display terminal, но теперь это более часто окно на графическом рабочем столе. Более детально остановимся на том, как переадресовывать эти стандартные потоки ввода – вывода, охваченные в более поздней секции этой обучающей программы, это: pipes and redirects. Остальная часть этой секции сосредотачивается на redirection высокого уровня.

Для изучения остальной части этой обучающей программы, мы предположим, что вы уже знаете, как вызывается shell приглашение. Если нет, то разработчик работает над статьей «Основные задачи для новых Linux разработчиков», которая показывает вам, как делать это и больше.

Если Вы используете Linux систему без графического рабочего стола, или если Вы открываете окно терминала на графическом рабочем столе, вы будете приветствоваться приглашением, возможно подобно показанному примеру в Listing 1.

Listing 1.. Некоторый типичный пользовательское приглашение:

[ *****@***db2inst1] $

Ian@lyrebird: ~ >

$

Если вы регистрируетесь под пользователем root (или супер пользователь), ваше приглашение может выглядеть, как показано в Listing 2:

Listing 2. Супер пользователь, или root, примеры приглашений:

[*****@***root]#

lyrebird:~ #

#

Пользователь root имеет значительные возможности, поэтому используйте его с особой осторожностью. Когда вы имеете root привилегии, большинство приглашений, включают trailing pound знак (#). Обычные пользовательские привилегии, обозначаются различными знаками, обычно знаком доллара ($). Ваше фактический приглашение может выглядеть по-другому, чем примеры, показанные в этой обучающей программе. Ваше приглашение может включать ваше имя пользователя, имя хоста (hostname), имя текущего рабочего каталога, дату или время.

Соглашение в этой обучающей программе

Разработчики, разрабатывающие обучающие программы для LPI 101 и 102 экзамена, включают примеры кодов, которые взяты из реальных Linux систем, использующих по умолчанию приглашения для всех систем. Root приглашение, имеет trailing #, так что вы можете отличать их от обычных пользовательских приглашений, которые имеют trailing $. Это соглашение последовательно прослеживается во многих книгах по данному предмету. Обратите внимание, что приглашение тщательно в любых примерах.

Команды и последовательности

Теперь, когда вы знаете что такое приглашение, давайте посмотрим, что вы можете сделать с ним.

Главная функция оболочки это интерпретировать ваши команды, так что вы могли взаимодействовать с вашей Linux системой. На Linux (и UNIX) системе, команды имеют командное имя, опции и параметры. Некоторые команды не имеют ни опций, ни

параметров, некоторые имеют опции, но не имеют параметров, в то время как другие не имеют опций, но имеют параметры.

Если линия содержит “#” знак, то все остающиеся знаки на линии игнорируются.

Знак “#” может указывать на comment также как root приглашение. Какой из них - это

должно быть, очевидно, из контекста.

Echo

Команда Echo печатает её аргументы терминалу, как это показано в Listing 3:

Listing 3:

[*****@***ian]$ echo Word

Word

[*****@***ian]$ echo A phrase

A phrase

[*****@***ian]$ echo Where are my spaces?

Where are my spaces?

[*****@***ian]$ echo "Here are my spaces." # plus comment

Here are my spaces.

В Listing 3 все пробелы были сжаты до одного пробела на выходе. Чтобы избежать этого, необходимо выделять строку с помощью двойных (“”), либо одинарных (‘’) кавычек. Bash использует символы табуляции и пустой строки, строку знаков, для того чтобы разделить вашу входную шину на метки (знаки), которые затем передаются вашей команде. Выделяя строку с помощью двойных или одинарных кавычек, вы сохраняете дополнительные символы табуляции и пустой строки и представляете всю строку одной меткой (знаком). В примере, описанном выше, каждая метка (знак) после имени команды – это параметр, таким образом, мы имеем соответственно 1, 2, 4 и 1 параметры. Команда echo имеет несколько опций. Как правило, команда echo будет добавлять новую замыкающую строку знаков на выходе. Используйте –n опцию для того чтобы избежать этого. Use the –e option to enable certain backslash escaped characters to have special meaning. Some of these are shown in Table 3.

Таблица 3:

Escapes и строка продолжения

Существует небольшая проблема с использованием backslashes (\) в Bash. Когда символ backslash (\) не взят в кавычки, он служит переходом к signal bash itself (bash сигналу) для того чтобы сохранить прямое значение следующего символа. Это необходимо для специальных shell метасимволов, которые мы сразу же накроем. Существует одно исключение для этого правила: символ перевода строки после backslash послужит причиной того, что bash “проглотит” оба символа и интерпретирует последовательность (символ перевода строки после backslash) как line continuation request. Это может быть удобно для разбиение больших (длинных) линий.

Для того чтобы команда echo или одна из многих команд, которые используют похожие знаки перехода (знаки переключения кода) правильно обработали последовательности, описанные выше, вы должны включить управляющую последовательность (последовательность переключения кода) в кавычки или в строку, взятую в кавычки, за исключением тех случаев, когда вы используете второй backslash для того, чтобы shell сохранил один backslash для команды. В Listing 4 показаны несколько способов использования backslash.

Listing 4. More echo examples

[*****@***ian]$ echo -n No new line

No new line[*****@***ian]$ echo - e "No new line\c"

No new line[*****@***ian]$ echo "A line with a typed

> return"

A line with a typed

return

[*****@***ian]$ echo -e "A line with an escaped\nreturn"

A line with an escaped

return

[*****@***ian]$ echo "A line with an escaped\nreturn but no - e option"

A line with an escaped\nreturn but no - e option

[*****@***ian]$ echo -e Doubly escaped\\n\\tmetacharacters

Doubly escaped

metacharacters

[*****@***ian]$ echo Backslash \

> followed by newline \

> serves as line continuation.

Backslash followed by newline serves as line continuation.

Запомните, что bash показывает специальную подсказку (>), когда вы печатаете строку с несогласованными кавычками. Вы продолжаете печатать на следующей строке, начиная с новой строки символов.

Метасимволы оболочки Bash и операторы управления

В bash существует несколько метасимволов, если они не взяты в кавычки, то они также служат для разделения входных данных в слова. Кроме пробела для этого используются '|', '&', ';', '(', ')', '<', и '>'. Мы обсудим некоторые из этих символов более подробно в других главах учебного пособия. Запомните, что если вы хотите использовать метасимвол в тексте, то он должен быть взят в кавычки или escaped использую backslash (\), как показано в Listing 4. Новая строка и метасимволы или пары метасимволов также служат операторами управления. Это ||', '&&', '&', ';', ';;', '|'' '(', и ')'. Некоторые из этих операторов управления позволяют создавать последовательности или списки команд.

Самая простейшая последовательность команд это две команды, разделенные точкой с запятой (;). Каждая команда выполняется последовательно. В каждой программируемой области, команды возвращают указатель успеха или провала; в Linux команды обычно возвращают нулевое значение при успехе и ненулевое при провале. Вы можете поместить conditional processing в ваш список, используя, операторы управления && и ||. Если вы разделяете две команды оператором управления &&, тогда вторая команда будет выполнена тогда и только тогда, когда первая команда возвращает выходное значение равное нулю. Если вы разделяете две команды оператором управления ||, тогда вторая команда будет выполнена, если первая команда возвращает выходное значение неравное нулю. В Listing 5 показаны некоторые последовательности команд, которые используют команду echo.

Listing mand sequences

[*****@***ian]$ echo line 1;echo line 2; echo line 3

line 1

line 2

line 3

[*****@***ian]$ echo line 1&&echo line 2&&echo line 3

line 1

line 2

line 3

[*****@***ian]$ echo line 1||echo line 2; echo line 3

line 1

line 3

Команда Exit

Вы можете завершить работу с shell, используя команду exit. Также вы можете использовать код завершения как параметр. If you are running your shell in a terminal window on a graphical desktop, your window will close. Проще говоря, если вы подсоединены к удаленной системе при помощи ssh или сетевого доступа (к примеру), связь будет прервана. В оболочке bash вы также можете выйти при помощи сочетания клавиш Ctrl+d.

Давайте рассмотрим другой оператор управления. Если вы заключите команду или список команд в круглые скобки, то команда или последовательность выполнится в subshell (под оболочке). Таким образом, команда exit выйдет из subshell (подоболочки) нежели из shell (оболочки), в которой вы работаете. В Listing 6 показаны примеры в связи с && и ||.

Listing 6. Subshells and sequences

[*****@***ian]$ (echo In subshell; exit 0) && echo OK || echo Bad exit

In subshell

OK

[*****@***ian]$ (echo In subshell; exit 4) && echo OK || echo Bad exit

In subshell

Bad exit

Сохраняйте настрой для дальнейшего ознакомления с последовательностями команд в нашем учебном пособии.

Переменные окружения

Когда вы работаете в оболочек bash, многие вещи составляют ваше окружение, например, такие как вид ваших подсказок, ваш исходный каталог, ваш рабочий каталог, имя вашей оболочки, файлы, которые вы открыли, функции, которые вы определили и так далее. Ваше окружение включает в себя множество переменных, которые были определены вами или bash. Оболочка bash также позволяет вам иметь переменные оболочки, которые вы можете экспортировать в ваше окружение для использования их другими запущенными процессами или другими оболочками, которые вы можете создать из текущей оболочки. И переменные окружения, и переменные оболочки имеют имя. Вы ссылаетесь на значение переменной, подставляя ‘$’ к имени переменной. Некоторые простые переменные окружения, с которыми вы столкнетесь, показаны в Таблице 4.

Таблица 4:

Listing 7. Environment and shell variables

[*****@***ian]$ echo $USER $UID

ian 500

[*****@***ian]$ echo $SHELL $HOME $PWD

/bin/bash /home/ian /home/ian

[*****@***ian]$ (exit 0);echo $?;(exit 4);echo $?

04

[*****@***ian]$ echo $$ $PPID

30

Not using bash?

The bash shell is the default shell on most Linux distributions. If you

are not running under the bash shell, you may want to consider one

of the following ways to practice with the bash shell.

• Use the

chsh - s /bin/bash

command to change your default shell. The default will

take over next time you log in.

• Use the

su - $USER - s /bin/bash

command to create another process as a child of your

current shell. The new process will be a login shell using

bash.

• Create an id with a default of a bash shell to use for LPI

exam preparation.

Вы можете создать или установить переменную оболочки поставив знак равенства (=) после имени переменной. Переменные чувствительны к изменению условий, т. е. var1 и VAR1 это разные переменные. Условились, что переменные, особенно экспортированные переменные это верхний регистр, но это не обязательное требование. Технически, $$ and $? это скорее параметры оболочки, чем переменные. Они могут быть referenced; вы можете присвоить им значения.

Когда вы создаете переменную оболочки, вы захотите экспортировать её в ваше окружение для того, чтобы она была доступна для других процессов. Переменные, которые вы экспортируете, не доступны для программной оболочки. Для экспортирования имя переменной используется команда “export”. Как “горячие клавиши” в bash, вы можете присвоить значение и экспортировать переменную в одно мгновение.

Для иллюстрации присваивания и экспортирования, запустите bash команду, находясь в bash оболочке, а затем запустите Korn оболочку (ksh) из новой bash оболочки. Мы используем команду ps для отображения информации о текущей запущенной программе. Мы узнаем больше о команде ps, когда будем изучать тему:”Состояние процесса”, в данном учебном пособии.

Listing 8. More environment and shell variables

[*****@***ian]$ ps -p $$ - o "pid ppid cmd"

PID PPID CMD

30bash

[*****@***ian]$ bash

[*****@***ian]$ ps -p $$ - o "pid ppid cmd"

PID PPID CMD

16bash

[*****@***ian]$ VAR1=var1

[*****@***ian]$ VAR2=var2

[*****@***ian]$ export VAR2

[*****@***ian]$ export VAR3=var3

[*****@***ian]$ echo $VAR1 $VAR2 $VAR3

var1 var2 var3

[*****@***ian]$ echo $VAR1 $VAR2 $VAR3 $SHELL

var1 var2 var3 /bin/bash

[*****@***ian]$ ksh

$ ps - p $$ - o "pid ppid cmd"

PID PPID CMD

16ksh

$ export VAR4=var4

$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL

var2 var3 var4 /bin/bash

$ exit

$ [*****@***ian]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL

var1 var2 var3 /bin/bash

[*****@***ian]$ ps - p $$ - o "pid ppid cmd"

PID PPID CMD

16bash

[*****@***ian]$ exit

[*****@***ian]$ ps - p $$ - o "pid ppid cmd"

PID PPID CMD

30bash

[*****@***ian]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL

/bin/bash

Заметки:

При старте, оболочка bash имеет идентификационный номер процесса 30576 Вторая bash оболочка имеет идентификационный номер процесса 16353, а идентификационный номер процесса ее роди, оригинальная bash оболочка. Мы создали VAR1, VAR2, и VAR3 во второй bash оболочке, но только экспортировали VAR2 and VAR3. В Korn оболочке мы создали VAR4. Команда echo отображает значения только для VAR2, VAR3, and VAR4, подтверждая, что VAR1 не была экспортирована. Были ли вы удивлены, узнав, что значение переменной оболочки не изменилось, несмотря на то, что приглашение изменилось. Вы не можете всегда полагаться на shell для того, чтобы сказать, какая оболочка у вас запущена, но команда ps может помочь вам в этом. Запомните, что ps ставит дефис (-) напротив первой bash оболочки для того, чтобы указать, что это Login shell. Возвращаясь ко второй bash оболочке, мы можем видеть VAR1, VAR2, и VAR3. В заключении, если мы возвращаемся в оригинальную оболочку, ни одна из новых переменных не существует.

Раньше в обсуждении выделения было упомянуто о том, что можно использовать одинарные и двойные кавычки. Существует существенное различие между ними. Shell увеличивает переменные оболочки, которые находятся между двойными кавычками, но увеличение не работает при использовании одинарных кавычек. В прошлом примере мы запустили оболочку внутри нашей оболочки и получили новый идентификатор процесса. Используя - с опцию вы можете передавать команду другой оболочке, которая выполнит, а затем вернет команду. Если вы передадите выделенную строку как параметр, то ваша внешняя оболочка уберет кавычки и передаст строку. Если используются двойные кавычки, то увеличение переменной произойдет до того как string is another process и тогда у них будет другой идентификационный номер процесса. Listing 9 иллюстрирует данный принцип.

Listing 9. Quoting and shell variables

[*****@***ian]$ echo "$SHELL" '$SHELL' "$$" '$$'

/bin/bash $SHELL 19244 $$

[*****@***ian]$ bash - c "echo Expand in parent $$ $PPID"

Expand in parent 19244 19243

[*****@***ian]$ bash - c 'echo Expand in child $$ $PPID'

Expand in child 19297 19244

До сих пор, все наши переменные ссылки были завершены с символами табуляции и пустой строки. На самом деле имена переменных могут быть составлены из букв, цифр и символов подчеркивания. Shell знает, что имя переменной заканчивается там, где другой символ найден. Иногда вам нужно использовать переменные в выражениях, где значение двусмысленно. В таких случаях вы можете использовать фигурные скобки для обрисовывания имени переменной, как показано в Listing10.

Listing 10. Using curly braces with variable names

[*****@***ian]$ echo "-$HOME/abc-"

-/home/ian/abc-

[*****@***ian]$ echo "-$HOME_abc-"

--

[*****@***ian]$ echo "-${HOME}_abc-"

-/home/ian_abc-

Команда Env

Команда еnv без опций и параметров, она отображает текущие переменные окружения. Вы можете также использовать эту команду для выполнения команды в пользовательском окружении. –I опция (или просто -) очищает текущее окружение до запуска команды, в то время как –u опция возвращает в исходное состояние переменные окружения, которые вы не хотите передавать.

Listing 11 показывает частичный выход команды env без параметров и затем три примера активизации (вызова) различных оболочек без родительского окружения.

Listing 11. The env command

[*****@***ian]$ env

HOSTNAME=echidna

TERM=xterm

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=9.27.89.

SSH_TTY=/dev/pts/2

USER=ian

...

_=/bin/env

OLDPWD=/usr/src

[*****@***ian]$ env - i bash - c 'echo $SHELL; env'

/bin/bash

PWD=/home/ian

SHLVL=1

_=/bin/env

[*****@***ian]$ env - i ksh - c 'echo $SHELL; env'

_=/bin/env

PATH=/bin:/usr/bin

[*****@***ian]$ env - i tcsh - c 'echo $SHELL; env'

SHELL: Undefined variable.

Заметьте, что bash установил параметры оболочки, но не экспортировал их в окружение, хотя есть три другие переменные, которые bash создал в окружении. В ksh примере (Korn shell) мы имеем две переменные окружения, но наши попытки echo значения переменных оболочки выдает пустую строку. В конце концов, tcsh не создает никаких переменных окружения и производит ошибку, при наших попытках сослаться на значение SHELL.

Сброс и набор

Листинг 11 показывает различное поведение оболочки, обрабатывающая переменные и окружающие среды. В то время как эта обучающая программа сосредотачивается на ударе, необходимо хорошо знать, что не все оболочки ведут себя одинаково. Кроме того, оболочки ведут себя по-другому, в зависимости от того являются ли они оболочкой входа в систему или нет. Пока, мы только скажем, что оболочка входа в систему это оболочка, которую вы видите, при входе в систему. Три оболочки, рассмотренные выше использующие конверт - i не являлись оболочкой входа в систему. Попробуйте передать - l опцию непосредственно к команде оболочки, чтобы видеть какое различие.