Директории памяти (in memory directories)



/dev –здесь хранятся файлы устройств, которые кажутся обычными файлами, но на самом деле они не расположены на жестком диске. Эта папка заполняется файлами, по мере того как ядро начинает «видеть» новое оборудование. Общее железо, такое как жесткие диски, представлено файлами устройств в папке /dev с названием sd* для SATA, SCSI или USB, и файлами hd* для IDE и ATAPI. Помимо представления физического аппаратного обеспечения, некоторые файлы устройств особенные. Они могут быть очень полезны.

/dev/tty и /dev/pts – например, /dev/tty1 представляет консоль, присоединенную к системе. Когда ввод команд происходит в окне терминала, которое является частью графического интерфейса, как у Gnome или KDE, тогда терминал будет представлен как /dev/pts/1 (в обоих случаях цифра может быть другой.)

/dev/null – одно из специальных устройств, может быть определено, как «черная дыра», она имеет неограниченный объем, но ничего не может быть извлечено из неё. Технически говоря, все, записанное сюда будет сброшено. Эта папка может быть полезной ля того, чтобы переправлять сюда все нежелательные выводы от команд.

/proc – еще одна специальная директория, файлы, хранящиеся здесь, представляются обычными, но не занимают места на диске. В целом, это вид на ядро, или, точнее, то чем ядро управляет, и оно служит для того, чтобы управлять ядром напрямую.

 

11. /usr – Unix System Resources. Иерархия этой директории должна содержать общие данные и данные, открытые только для чтения. Некоторые люди предпочитают установить /usr полностью в режим read only.

/usr/bin– здесь хранятся сами команды.

/usr/include– основные используемые подключаемые файлы для Си.

/usr/lib – библиотеки, которые выполняются не напрямую пользователями или скриптами.

/usr/local – может использоваться администратором, для локальной установки ПО

/usr/share – архитектурно независимые данные. Например, здесь нередко содержится /usr/share/man– для мануалов, или /usr/share/games для всей неизменной игровой информации (никакой информации об очках или историй игр.)

/usr/src –рекомендуемая директория для расположения исходных файлов ядра.

 

12. /var – переменные данные (variable data) –для всех файлов, имеющих неопределенный размер, таких какистории сообщений (логи), кэш и файлы очереди (spool files).

/var/log –все логи.

/var/log/messages –для Red Hat (и производных) – в этом файле содержится информация о том, что только что произошло с системой. Для Debian и Ubuntu это /var/log/syslog

/var/cache –кэш для некоторых приложений.

/var/spool –содержит информацию об очередях для писем и cron, но также может быть родительской директорией для других файлов очередей, например файла очереди печати.

/var/lib – информация о состоянии приложения.

/var/… -в папке var также хранятся файлы ID для процессов в /var/runи временные файлы, которые помогают восстановиться после перезагрузки в /var/tmp,а также информация о блокировке файлов в /var/lock.

III. shell expansion

Эта глава ознакомит вас с расширениями оболочки (shell expansion), более подробно рассматривая программы и аргументы. Знание этого материала важно, потому что множество команд в Linux системе обрабатываются и изменяются с помощью shell перед выполнением.

Интерфейс командной строки или оболочки, использующийся в большинстве систем Linux называется bash,что расшифровывается как Bourne Again SHell (граница снова оболочка, я не знаю, как это интерпретировать). Bash включает в себя функции от sh (оригинальный Bourne Shell), csh (C shell) и ksh (Korn Shell)

Commands and arguments

1. echo (читается, как «эко») –команда, использующаяся для возможностей shell, действие простое: она эхом выводит то, что было получено:

paul@laika:~$ echo Burtonville

Burtonville

paul@laika:~$ echo Smurfs are blue

Smurfs are blue

 

Arguments

Одна из основных особенностей shell – сканирование командной строки.Когда вы вводите команду в командную строку shell, и нажимаете ввод, тогда shell начинает сканирование этой строки, разбивая её на аргументы. По мере сканирования, shell может внести множество изменений в напечатанные аргументы. Этот процесс и называется расширением оболочки (shell expansion). Когда shell закончила сканирование и изменение строки, тогда команда выполняется.

Аргументы разделяются с помощью знаков пробела или табуляцией, поэтому любое пустое пространство между аргументами убирается при сканировании:

 

[paul@RHELv4u3 ~]$ echo Hello World

Hello World

[paul@RHELv4u3 ~]$ echo Hello World

Hello World

[paul@RHELv4u3 ~]$ echo Hello    World

Hello World

[paul@RHELv4u3 ~]$    echo    Hello   World

Hello World

 

Команда echo автоматически добавляет один пробел между введенными аргументами.

Одинарные кавычкипозволяют избежать такого удаления пробелов. Содержимое, заключенное в кавычки считается одним аргументом. В примере команда echo имеет только один аргумент:

 

[paul@RHEL4b ~]$ echo 'A line      with             single           quotes'

A line with             single           quotes

[paul@RHEL4b ~]$

 

Для этих же целей можно использовать и двойные кавычки, позднее, при работе с переменными, вы увидите важную разницу между ними.

Внутри кавычек для команды echo могут содержаться спец. символы, для их обработки надо добавить опцию –e (echo –e). Например, можно добавлять \n для перехода на новую строку или \t для табуляции (обычно примерно 8 пробелов):

 

 

[paul@RHEL4b ~]$ echo -e "A line with \na newline"

A line with

a newline

[paul@RHEL4b ~]$ echo -e 'A line with \na newline'

A line with

a newline

[paul@RHEL4b ~]$ echo -e "A line with \ta tab"

A line with   a tab

[paul@RHEL4b ~]$ echo -e 'A line with \ta tab'

A line with      a tab

[paul@RHEL4b ~]$

 

Внешние и встроенные команды

Не все команды являются внешними для оболочки, некоторые встроены в нее. Внешние команды, это программы, которые имеют собственные бинарные файлы где-то еще в файловой системе. Множество внешних команд расположено в /bin или /sbin. Встроенные командыявляются составной частью самой оболочки.

type –команда, позволяющая узнать будет ли команда, переданная shell выполнена как встроенная или как внешняя команда.

 

paul@laika:~$ type cd

cd is a shell builtin

paul@laika:~$ type cat

cat is /bin/cat

 

Как видно из примера, cd – встроенная команда, а cat – внешняя. Так же можно определить является ли команда «замененной» (aliased) или нет (об этом позднее).

 

paul@laika:~$ type ls

ls is aliased to `ls --color=auto'

 

Некоторые команды имеют одновременно и встроенную и внешнюю версии. Когда одна из этих команд выполняется, то встроенная версия имеет больший приоритет. Чтобы запустить внешнюю версию, необходимо ввести полный путь к команде

 

paul@laika:~$ type -a echo

echo is a shell builtin

echo is /bin/echo

paul@laika:~$ /bin/echo Running the external echo command...

Running the external echo command...

 

which –команда, которая ищет бинарники в среде переменных $PATH. В примере видно, что cd – встроенная команда, тогда как cp, rm, mv, mkdir, pwd и which – внешние команды.

 

[root@RHEL4b ~]# which cp ls cd mkdir pwd

/bin/cp

/bin/ls

/usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:...

/bin/mkdir

/bin/pwd

 

Замещения (aliases).Для удобства запоминания существующей команды, или для удобства ввода параметров, с помощью команды alias можно создавать «псевдонимы» для команд:

 

[paul@RHELv4u3 ~]$ cat count.txt

one

two

three

[paul@RHELv4u3 ~]$ alias dog=tac

[paul@RHELv4u3 ~]$ dog count.txt

three

two

one

 

 

Так же можно его использовать для сокращения существующей команды:

 

paul@laika:~$ alias ll='ls -lh --color=auto'

paul@laika:~$ alias c='clear'

paul@laika:~$

 

Можно так же использовать псевдонимы для придания команде некоторых функций по умолчанию, например чтобы команда rm всегда шла с опцией –i:

 

[paul@RHELv4u3 ~]$ rm -i winter.txt

rm: remove regular file `winter.txt'? no

[paul@RHELv4u3 ~]$ rm winter.txt

[paul@RHELv4u3 ~]$ ls winter.txt

ls: winter.txt: No such file or directory

[paul@RHELv4u3 ~]$ touch winter.txt

[paul@RHELv4u3 ~]$ alias rm='rm -i'

[paul@RHELv4u3 ~]$ rm winter.txt

rm: remove regular empty file `winter.txt'? no

[paul@RHELv4u3 ~]$

 

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

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

 

paul@laika:~$ alias c ll

alias c='clear'

alias ll='ls -lh --color=auto'

 

Чтобы снять замещение, используйте команду unalias:

[paul@RHEL4b ~]$ which rm

/bin/rm

[paul@RHEL4b ~]$ alias rm='rm -i'

[paul@RHEL4b ~]$ which rm

alias rm='rm -i'

/bin/rm

[paul@RHEL4b ~]$ unalias rm

[paul@RHEL4b ~]$ which rm

/bin/rm

[paul@RHEL4b ~]$

 

Вы можете отобразить, что именно происходит при shell expansion (расширении оболочки) с помощью команды set -x и прекратить отображение командой set +x.Возможно, вам понадобится это далее в нашем курсе, или когда вы сомневаетесь, что именно делает shell с вашей командой.

 

[paul@RHELv4u3 ~]$ set -x

++ echo -ne '\033]0;paul@RHELv4u3:~\007'

[paul@RHELv4u3 ~]$ echo $USER

+ echo paul

paul

++ echo -ne '\033]0;paul@RHELv4u3:~\007'

[paul@RHELv4u3 ~]$ echo \$USER

+ echo '$USER'

$USER

++ echo -ne '\033]0;paul@RHELv4u3:~\007'

[paul@RHELv4u3 ~]$ set +x

+ set +x

[paul@RHELv4u3 ~]$ echo $USER

paul

Control operators

Тут будем рассматривать, как обрабатывать больше одной команды в командной строке за один раз.

Точка с запятой

Вы можете поместить в одну строку 2 или больше команд разделенных точкой с запятой ; . Все аргументы до неё будут отделены и отнесены к первой команде. Обе команды будут выполнены последовательно. Shell будет ожидать окончания выполнения команды до начала следующей.

 

[paul@RHELv4u3 ~]$ echo Hello

Hello

[paul@RHELv4u3 ~]$ echo World

World

[paul@RHELv4u3 ~]$ echo Hello ; echo World

Hello

World

[paul@RHELv4u3 ~]$

 

2. & - амперсанд

Когда строка оканчивается знаком амперсанда, то shell не будет ожидать завершение выполнения команды. Вы получите возможность сразу вводить новые команды, а предыдущая команда будет выполняться в фоновом режиме. По завершении выполнения вы получите сообщение.

 

[paul@RHELv4u3 ~]$ sleep 20 &

[1] 7925

[paul@RHELv4u3 ~]$

...wait 20 seconds...

[paul@RHELv4u3 ~]$

[1]+ Done sleep 20

 

Техническое объяснение происходящего в этом случае будет объяснено в главе о процессах.

 

3. $? dollar question mark

Код выхода предыдущей команды хранится в shell переменной $?. Вообще то $? является параметром shell, а не переменной, так как вы не можете присвоить значение для $?.

 

paul@debian5:~/test$ touch file1

paul@debian5:~/test$ echo $?

0

paul@debian5:~/test$ rm file1

paul@debian5:~/test$ echo $?

0

paul@debian5:~/test$ rm file1

rm: cannot remove `file1': No such file or directory

paul@debian5:~/test$ echo $?

1

paul@debian5:~/test$

 

Как видно, если команда выполнена, код – 0, если не выполнена – 1.

 

4. && - двойной амперсанд. Shell интерпретирует && как логическое И. При использовании && вторая команда будет выполнена только в случае, если будет выполнена первая команда (вернет нулевой статус выхода).

 

paul@barry:~$ echo first && echo second

first

second

paul@barry:~$ zecho first && echo second

-bash: zecho: command not found

 

Другой пример логического И, сначала команда cd работает, соответственно выполняется команда ls, потом команда cd не может быть выполнена, следовательно не выполняется команда ls.

[paul@RHELv4u3 ~]$ cd gen && ls

file1 file3 File55 fileab FileAB fileabc

file2 File4 FileA Fileab fileab2

[paul@RHELv4u3 gen]$ cd gen && ls

-bash: cd: gen: No such file or directory

 

5. || двойная вертикальная черта

Представляет собой логическое ИЛИ. Вторая команда выполняется только в случае, если первая команда не выполняется (возвращает ненулевой статус выхода).

 

paul@barry:~$ echo first || echo second ; echo third

first

third

paul@barry:~$ zecho first || echo second ; echo third

-bash: zecho: command not found

second

third

paul@barry:~$

 

Другой пример того же принципа:

 

[paul@RHELv4u3 ~]$ cd gen || ls

[paul@RHELv4u3 gen]$ cd gen || ls

-bash: cd: gen: No such file or directory

file1 file3 File55 fileab FileAB fileabc

file2 File4 FileA Fileab fileab2

 

6. Комбинации && и ||

Можно использовать эти логические И и ИЛИ чтобы писать структуры if-then-else в командной строке. В примере команда echo используется для определения, была ли команда rm выполнена успешно

 

paul@laika:~/test$ rm file1 && echo It worked! || echo It failed!

It worked!

paul@laika:~/test$ rm file1 && echo It worked! || echo It failed!

rm: cannot remove `file1': No such file or directory

It failed!

paul@laika:~/test$

 

Решетка/диез/знак фунта

Все что написано после этого символа игнорируется shell. Это полезно для написания комментариев, но не имеет никакого влияния на выполнение команды или расширение shell.

paul@debian4:~$ mkdir test # we create a directory

paul@debian4:~$ cd test #### we enter the directory

paul@debian4:~/test$ ls # is it empty ?

paul@debian4:~/test$

 

8. \ избежание специальных символов

Символ обратного слеша \ отменяет использование управляющих символов (control characters), но shell так же не интерпретирует их:

 

[paul@RHELv4u3 ~]$ echo hello \; world

hello ; world

[paul@RHELv4u3 ~]$ echo hello\ \ \ world

hello world

[paul@RHELv4u3 ~]$ echo escaping \\\ \#\ \&\ \"\ \'

escaping \ # & " '

[paul@RHELv4u3 ~]$ echo escaping \\\?\*\"\'

escaping \?*"'

 

Строка, заканчивающаяся обратным слешем, будет продолжена на следующей строке. Shell никак не будет интерпретировать этот символ и будет ждать shell expansion и не будет выполнять команду до тех пор, пока не встретится новая строка без обратного слеша:

 

[paul@RHEL4b ~]$ echo This command line \

> is split in three \

> parts

This command line is split in three parts

[paul@RHEL4b ~]$

 

12. variables

Тут будем рассматривать переменные.

 

1. $ - знак доллара

Еще один важный символ, интерпретируемый с помощью shell – знак $. Shell будет смотреть на переменную среды (environment variable) названную как строка, которая начинается знаком $ и заменяет её значением переменной (или ничем, если переменная не существует). Вот пример использования $HOSTNAME, $USER, $UID, $SHELL и $HOME:

 

[paul@RHELv4u3 ~]$ echo This is the $SHELL shell

This is the /bin/bash shell

[paul@RHELv4u3 ~]$ echo This is $SHELL on computer $HOSTNAME

This is /bin/bash on computer RHELv4u3.localdomain

[paul@RHELv4u3 ~]$ echo The userid of $USER is $UID

The userid of paul is 500

[paul@RHELv4u3 ~]$ echo My homedir is $HOME

My homedir is /home/paul

 

Имена переменных чувствительны к регистру:

 

[paul@RHELv4u3 ~]$ echo Hello $USER

Hello paul

[paul@RHELv4u3 ~]$ echo Hello $user

Hello

 

Переменная $SP1 отвечает за текст, который вы видите в начале командной строки (на примере будет ясно). Вы можете использовать обратный слеш, чтобы избежать спец символов, таких как \u для имени пользователя или \w для активной директории. Мануал bash содержит полную информацию.

В этом примере мы меняем переменную $PS1 несколько раз:

 

paul@deb503:~$ PS1=prompt

prompt                            #ввод текста сразу за словом prompt без пробела

promptPS1='prompt '

prompt                            #ввод текста после слова prompt через пробел

prompt PS1='> '

>

> PS1='\u@\h$ '

paul@deb503$

paul@deb503$ PS1='\u@\h:\W$'

paul@deb503:~$

 

Чтобы избежать неисправимых ошибок, вы можете изменить цвет текста для обычного пользователя на зеленый, а root пользователя на красный. Добавьте этот текст в ваш файл .bashrc для зеленого цвета строки у пользователя:

 

# color prompt by paul

RED='\[\033[01;31m\]'

WHITE='\[\033[01;00m\]'

GREEN='\[\033[01;32m\]'

BLUE='\[\033[01;34m\]'

export PS1="${debian_chroot:+($debian_chroot)}$GREEN\u$WHITE@$BLUE\h$WHITE\w\$ "

 

$PATH – переменная, которая определяет, где shell смотрит, какие команды исполнять (в случае, если команда не встроенная или замещенная псевдонимом). Эта переменная содержит список директорий, разделенных двоеточием:

 

[[paul@RHEL4b ~]$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:

Shell не будет искать в текущей директории исполняемые команды! (Эта уязвимость позволяла легко взламывать PC-DOS компьютеры). Если вы хотите, чтобы shell искал в текущей директории, то добавьте точку . в конец вашей переменной $PATH.

 

[paul@RHEL4b ~]$ PATH=$PATH:.

[paul@RHEL4b ~]$ echo $PATH

/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:.

[paul@RHEL4b ~]$

 

Ваш путь может отличаться, если использовать “su” вместо “su -” потому что последний будет рассматривать как среду конечного пользователя. Обычно root пользователь имеет директорию /sbin добавленную к переменной $PATH:

 

[paul@RHEL3 ~]$ su

Password:

[root@RHEL3 paul]# echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin

[root@RHEL3 paul]# exit

[paul@RHEL3 ~]$ su -

Password:

[root@RHEL3 ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:

[root@RHEL3 ~]#

 

Создание переменных.Этот пример покажет создание переменной $MyVar и установит её значение. Затем используем команду echo чтобы проверить значение:

 

[paul@RHELv4u3 gen]$ MyVar=555

[paul@RHELv4u3 gen]$ echo $MyVar

555

[paul@RHELv4u3 gen]$

 

Обратите внимание, что двойные кавычки позволяют командам использовать переменные, в то время как одинарные не допускают этого:

 

[paul@RHELv4u3 ~]$ MyVar=555

[paul@RHELv4u3 ~]$ echo $MyVar

555

[paul@RHELv4u3 ~]$ echo "$MyVar"

555

[paul@RHELv4u3 ~]$ echo '$MyVar'

$MyVar

 

Bash shell будет заменять переменные на их значение в двойных кавычках, но не в одинарных:

 

paul@laika:~$ city=Burtonville

paul@laika:~$ echo "We are in $city today."

We are in Burtonville today.

paul@laika:~$ echo 'We are in $city today.'

We are in $city today.

 

Используйте команду setдля того чтобы вывести список переменных в среде. В Ubuntu и Debian команда set также выведет список функций после переменных. Используйте set | more чтобы увидеть переменные.

Используйте команду unset,чтобы удалить переменную из своей shell среды:

 

[paul@RHEL4b ~]$ MyVar=8472

[paul@RHEL4b ~]$ echo $MyVar

8472

[paul@RHEL4b ~]$ unset MyVar

[paul@RHEL4b ~]$ echo $MyVar

[paul@RHEL4b ~]$

 

Команда env без опций покажет список экспортируемых переменных. Разница между set с опциями в том, что set показывает все переменные, включая те, которые не экспортируются в дочерние shell’ы.

Но envможет также быть использована, чтобы создать новую, чистую оболочку (shell без какой-либо унаследованной среды). Команда env –iочищает среду для внутренней оболочки. Обратите внимание, что в примере bash сначала устанавливает переменную $SHELL при запуске.

 

[paul@RHEL4b ~]$ bash -c 'echo $SHELL $HOME $USER'

/bin/bash /home/paul paul

[paul@RHEL4b ~]$ env -i bash -c 'echo $SHELL $HOME $USER'

/bin/bash

[paul@RHEL4b ~]$

 

Вы можете использовать команду envдля того, чтобы установить переменную $LANG, или любую другую, всего за одну команду bash. Пример ниже использует это, чтобы показать влияние переменной $LANG на файл подстановки.

 

[paul@RHEL4b test]$ env LANG=C bash -c 'ls File[a-z]'

Filea Fileb

[paul@RHEL4b test]$ env LANG=en_US.UTF-8 bash -c 'ls File[a-z]'

Filea FileA Fileb FileB

[paul@RHEL4b test]$

 

Вы можете экспортировать переменные среды с помощью команды export.Она позволит экспортировать переменные в дочерние оболочки.

 

[paul@RHEL4b ~]$ var3=three

[paul@RHEL4b ~]$ var4=four

[paul@RHEL4b ~]$ export var4

[paul@RHEL4b ~]$ echo $var3 $var4

three four

[paul@RHEL4b ~]$ bash

[paul@RHEL4b ~]$ echo $var3 $var4

four

 

Но не сможет экспортировать в родительскую оболочку (пример продолжается).

 

[paul@RHEL4b ~]$ export var5=five

[paul@RHEL4b ~]$ echo $var3 $var4 $var5

four five

[paul@RHEL4b ~]$ exit

exit

[paul@RHEL4b ~]$ echo $var3 $var4 $var5

three four

[paul@RHEL4b ~]$

 

Разграничение переменных.До сих пор мы видели, что bash интерпретирует переменные, начинающиеся со знака $ и продолжающихся до первого не алфавитно-цифрового символа, который не является нижним подчеркиванием. В некоторых ситуациях это может быть проблемой. Этот вопрос может быть решен с помощью фигурных скобок, как в примере:

 

[paul@RHEL4b ~]$ prefix=Super

[paul@RHEL4b ~]$ echo Hello $prefixman and $prefixgirl

Hello and

[paul@RHEL4b ~]$ echo Hello ${prefix}man and ${prefix}girl

Hello Superman and Supergirl

[paul@RHEL4b ~]$

 

Несвязанные переменные.В примере ниже пытаемся показать значение переменной $MyVar, но у нас не получается, поскольку переменная не существует. По умолчанию shell выведет пустоту, когда переменная не связана (не существует).

 

 

[paul@RHELv4u3 gen]$ echo $MyVar

[paul@RHELv4u3 gen]$

 

Однако существует опция nounset, которую можно использовать для создания текста ошибки, когда переменная не существует.

 

paul@laika:~$ set -u

paul@laika:~$ echo $Myvar

bash: Myvar: unbound variable

paul@laika:~$ set +u

paul@laika:~$ echo $Myvar

paul@laika:~$

 

В bash shell запись set –u идентична для set –o nounset и также set +u идентична для set +o nounset.

 

Опции оболочки.Обе команды set и unset являются встроенными командами shell. Они могут быть использованы для установки опций самой оболочки bash. Следующий пример пояснит это. По умолчанию, shell будет рассматривать неустановленные переменные, как переменные, у которых нет значения. Установив функцию  –u, оболочка будет рассматривать любые ссылки на неустановленные переменные как ошибку. Загляните в мануал bash’а для большей информации.

 

[paul@RHEL4b ~]$ echo $var123

[paul@RHEL4b ~]$ set -u

[paul@RHEL4b ~]$ echo $var123

-bash: var123: unbound variable

[paul@RHEL4b ~]$ set +u

[paul@RHEL4b ~]$ echo $var123

[paul@RHEL4b ~]$

 

Чтобы вывести список всех опций вашей оболочки, используйте echo $-. Функция noclobber(или –C)будет объяснена позже в этой книге.

 

[paul@RHEL4b ~]$ echo $-

himBH

[paul@RHEL4b ~]$ set -C ; set -u

[paul@RHEL4b ~]$ echo $-

himuBCH

[paul@RHEL4b ~]$ set +C ; set +u

[paul@RHEL4b ~]$ echo $-

himBH

[paul@RHEL4b ~]$

 

Когда вводишь setбез каких-либо опций, то получаешь список всех переменных без функций, когда оболочка находится в состоянии posix. Вы можете перевести bash в это состояние, напечатав set –o posix.

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

 

[paul@RHELv4u3 gen]$ echo $var1

[paul@RHELv4u3 gen]$ echo $(var1=5;echo $var1)

5

[paul@RHELv4u3 gen]$ echo $var1

[paul@RHELv4u3 gen]$

 

Вы можете вложить оболочку во вложенную оболочку, это называется сложным вложением оболочек (nested embedding of shells). Этот пример показывает вложенную оболочку внутри вложенной оболочки.

paul@deb503:~$ A=shell

paul@deb503:~$ echo $C$B$A $(B=sub;echo $C$B$A; echo $(C=sub;echo $C$B$A))

shell subshell subsubshell

 

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

 

[paul@RHELv4u3 ~]$ echo `cd /etc; ls -d * | grep pass`

passwd passwd- passwd.OLD

[paul@RHELv4u3 ~]$

 

Вы можете использовать только конструкцию $() для сложных вложений, обратные кавычки этого не могут.

Размещение вложения между обратными кавычками использует на 1 символ меньше, чем сочетание доллара и скобок. Однако будьте осторожны, очень легко перепутать одинарные и обратные кавычки. Техническое различие между ‘ и ` очень значительно!

 

[paul@RHELv4u3 gen]$ echo `var1=5;echo $var1`

5

[paul@RHELv4u3 gen]$ echo 'var1=5;echo $var1'

var1=5;echo $var1

[paul@RHELv4u3 gen]$

 

13. shell history

Оболочка позволяет легко для нас повторять команды, эта глава объяснит как.

1.Чтобы повторить последнюю команду bash напечатайте !!. Это произносится как bang bang.

 

paul@debian5:~/test42$ echo this will be repeated > file42.txt

paul@debian5:~/test42$ !!

echo this will be repeated > file42.txt

paul@debian5:~/test42$

 

2. Повторение других команд.Вы можете использовать повторение других команд используя один bang,сопроводив его одним или более символов. Shell тогда повторит последнюю команду, начинавшуюся с этих символов.

paul@debian5:~/test42$ touch file42

paul@debian5:~/test42$ cat file42

paul@debian5:~/test42$ !to

touch file42

paul@debian5:~/test42$

 

3. История.Чтобы увидеть более поздние команды, используйте команду history(или используйте history n, чтобы увидеть последние n команд)

paul@debian5:~/test$ history 10

38 mkdir test

39 cd test

40 touch file1

41 echo hello > file2

42 echo It is very cold today > winter.txt

43 ls

44 ls -l

45 cp winter.txt summer.txt

46 ls -l

47 history 10

 

4. !n.Когда вводишь ! и затем номер предшествовавшей команды, которую вы хотели бы повторить, тогда shell применит к ней echo и выполнит.

paul@debian5:~/test$ !43

ls

file1 file2 summer.txt winter.txt

5. Ctrl-r.Можно использовать сочетание ctrl-r для поиска по истории. В примере ниже только нажали это сочетание, затем ввели apti тогда оно нашло последнюю команду, которая содержала эти 4 последовательных символа:

 

paul@debian5:~$

(reverse-i-search)`apti': sudo aptitude install screen

 

6. $HISTSIZE – переменная определяющая количество команд, которые будут запомнены в вашей текущей среде. В большинство дистрибутивов по умолчанию установлено 500 или 1000.

paul@debian5:~$ echo $HISTSIZE

500

 

Вы можете изменять значение этой переменной по усмотрению:

 

paul@debian5:~$ HISTSIZE=15000

paul@debian5:~$ echo $HISTSIZE

15000

 

7. $HISTFILE –переменная, указывающая на файл, который содержит вашу историю. Для bash shell по умолчанию это значение ~/.bash_history

 

paul@debian5:~$ echo $HISTFILE

/home/paul/.bash_history

 

История сессии сохраняется в этот файл, когда вы выходите из сессии!

Закрытие терминала в gnome с помощью мышки, или ввод команды reboot не сохранят вашу историю.

 

8. $HISTFILESIZE –количество команд, хранящихся в вашей истории, может быть настроено с помощью этой переменной.

 

paul@debian5:~$ echo $HISTFILESIZE

15000

 

9. (опционально) регулярные выражения.Можно использовать регулярные выражения (regular expressions) когда используете bangдля повторения команд. На примере внизу 1 заменяется на 2.

paul@deianb5:~/test$ cat file1

paul@debian5:~/test$ !c:s/1/2

cat file2

hello

paul@debian5:~/test$

 

10. (опционально) повторяющиеся команды в ksh.Повторение команд в Korn Shell довольно похожее. Он так же имеет команду history, но использует букву r, чтобы вызывать строки из истории. Пример показывает действие команды history. Обратите внимание на другое значение параметра:

$ history 17

17 clear

18 echo hoi

19 history 12

20 echo world

21 history 17

 

Повторение с помощью rможно совмещать с номерами строк, данными командой history, или с первыми несколькими буквами команды.

 

 

$ r e

echo world

world

$ cd /etc

$ r

cd /etc

$

 

14. file globbing

Shell также ответственен за файл подстановки (или динамическую генерацию файла (filename)). Эта глава объяснит файл подстановки (file globbing)

 

1. * - звездочка.С помощью shell интерпретируется как знак для генерации имен файлов, при этом звездочке ставится в соответствие любая комбинация символов (даже их отсутствие). Когда путь не задан, shell использует имена файлов в текущей директории. Для большей информации посмотрите мануал для glob(7).

[paul@RHELv4u3 gen]$ ls

file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc

[paul@RHELv4u3 gen]$ ls File*

File4 File55 FileA Fileab FileAB

[paul@RHELv4u3 gen]$ ls file*

file1 file2 file3 fileab fileabc

[paul@RHELv4u3 gen]$ ls *ile55

File55

[paul@RHELv4u3 gen]$ ls F*ile55

File55

[paul@RHELv4u3 gen]$ ls F*55

File55

[paul@RHELv4u3 gen]$

 

2. ? - Знак вопроса.Аналогично звездочке, интерпретируется как точно один символ.

[paul@RHELv4u3 gen]$ ls

file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc

[paul@RHELv4u3 gen]$ ls File?

File4 FileA

[paul@RHELv4u3 gen]$ ls Fil?4

File4

[paul@RHELv4u3 gen]$ ls Fil??

File4 FileA

[paul@RHELv4u3 gen]$ ls File??

File55 Fileab FileAB

[paul@RHELv4u3 gen]$

 

3. [] – квадратные скобки.Ищется совпадение с каким-либо символом, заключенным в квадратных скобках. Порядок символов при этом не важен. Каждая пара скобок интерпретируется точно как один символ.

[paul@RHELv4u3 gen]$ ls

file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc

[paul@RHELv4u3 gen]$ ls File[5A]

FileA

[paul@RHELv4u3 gen]$ ls File[A5]

FileA

[paul@RHELv4u3 gen]$ ls File[A5][5b]

File55

[paul@RHELv4u3 gen]$ ls File[a5][5b]

File55 Fileab

[paul@RHELv4u3 gen]$ ls File[a5][5b][abcdefghijklm]

ls: File[a5][5b][abcdefghijklm]: No such file or directory

[paul@RHELv4u3 gen]$ ls file[a5][5b][abcdefghijklm]

fileabc

[paul@RHELv4u3 gen]$

 

Вы также можете исключать символы из списка между квадратными скобками с помощью восклицательного знака. И вы вправе делать комбинации этих «диких карт» (wild cards).

 

[paul@RHELv4u3 gen]$ ls

file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc

[paul@RHELv4u3 gen]$ ls file[a5][!Z]

fileab

[paul@RHELv4u3 gen]$ ls file[!5]*

file1 file2 file3 fileab fileabc

[paul@RHELv4u3 gen]$ ls file[!5]?

fileab

[paul@RHELv4u3 gen]$

 

Диапазоны a-z и 0-9

Bash Shell также в состоянии понять диапазоны символов в скобках.

 

[paul@RHELv4u3 gen]$ ls

file1 file3 File55 fileab FileAB fileabc

file2 File4 FileA Fileab fileab2

[paul@RHELv4u3 gen]$ ls file[a-z]*

fileab fileab2 fileabc

[paul@RHELv4u3 gen]$ ls file[0-9]

file1 file2 file3

[paul@RHELv4u3 gen]$ ls file[a-z][a-z][0-9]*

fileab2

[paul@RHELv4u3 gen]$

 

5. $LANG и квадратные скобки.

Не стоит забывать о действии переменной LANG. Некоторые языки включают прописные буквы в диапазон заглавных (и наоборот).

 

paul@RHELv4u4:~/test$ ls [A-Z]ile?

file1 file2 file3 File4

paul@RHELv4u4:~/test$ ls [a-z]ile?

file1 file2 file3 File4

paul@RHELv4u4:~/test$ echo $LANG

en_US.UTF-8

paul@RHELv4u4:~/test$ LANG=C

paul@RHELv4u4:~/test$ echo $LANG

C

paul@RHELv4u4:~/test$ ls [a-z]ile?

file1 file2 file3

paul@RHELv4u4:~/test$ ls [A-Z]ile?

File4

paul@RHELv4u4:~/test$

 


Дата добавления: 2018-04-05; просмотров: 344; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!