Директории памяти (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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!