Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_voprosy.docx
Скачиваний:
9
Добавлен:
20.03.2016
Размер:
465.35 Кб
Скачать

III. Shell expansion

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

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

10. Commands and arguments

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

paul@laika:~$ echo Burtonville

Burtonville

paul@laika:~$ echo Smurfs are blue

Smurfs are blue

  1. 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 ~]$

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

Не все команды являются внешними для оболочки, некоторые встроены в нее. Внешние команды, это программы, которые имеют собственные бинарные файлы где-то еще в файловой системе. Множество внешних команд расположено в /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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]