Еще одной важной способностью командного интерпретатора, необходимой для разработки сценариев, является возможность подставлять различные вычисляемые значения в качестве аргументов запускаемых команд.
Простейшими вычисляемыми командным интерпретатором значениями являются имена файлов, соответствующие некоторым шаблонам. Язык шаблонных выражений крайне прост и основывается на понятии метасимволов, т. е. символов со специальными значениями (таблица ниже).
Содержимое
Шаблонные метасимволы
Метасимвол | Значение |
? | Любой один символ |
* | Любое количество любых других символов |
[ab…z] | Любой символ из набора a, b,…, z |
[!ab…z]
или [^ab…z] |
Любой символ НЕ из набора a, b,…, z |
∼ | Домашний каталог пользователя |
Использование метасимволов в команде интерпретатора заставляет его искать файлы, чьи имена соответствуют составленному шаблонному выражению, и подставлять их вместо самих шаблонных выражений.
В примере из листинга ниже шаблонное выражение y* используется для подстановки имен файлов, начинающихся с буквы у, за которой следует любое количество любых символов.
Выражение ???.* означает имена файлов, которые содержат три любых символа, потом символ . (точка), за которым следует любое количество любых символов. Сама работа подстановок интерпретатора может быть отслежена в режиме трассировки, который включается командой set -x (а выключается, как ни странно, командой set +x).
В этом режиме интерпретатора видно, что выражение [0-9]*, означающее имена файлов, начинающиеся с цифры, сначала вычисляется до соответствующего списка имен, который подставляется вместо , самого шаблонного выражения, и только потом выполняется команда ls, в аргументах которой оно было использовано.
Аналогично вычисляется и подставляется шаблонное выражение [!a-z0-9]*, означающее имена файлов, начинающихся с символов, не являющихся ни буквой, ни цифрой.
Таким образом, ни одна команда самостоятельно не вычисляет подстановки имен файлов, а пользуется результатами вычислений так, как будто они были заданы непосредственно в качестве ее аргументов.
Просмотр файлов man-страниц по критерию имени
bender@jbuntu:~$ cd /usr/share/man/man1
berxier@ubuntu:/usr/share/nan/man1$ ls у*
yacc.1.gz yelp.1.gz youtube-dl.1.gz yuvsplittoppm.1.gz
ybmtopbm.1.gz yes.1.gz ypdomainname.1.gz yuvtoppm.1.gz
bender@ubuntu:/usr/share/man/man1$ ls ???.*
7za.1.gz cpp.1.gz ftp.1.gz ldd.1.gz moc.1.gz s2p.1.gz tee.1.gz wmc.1.gz
a2p.1.gz cut.1.gz g++.1.gz lft.1.gz mrd.1.gz sar.1.gz tex.1.gz wrc.1.gz
crp.1.gz erb.1.gz kvtn.1.gz mft.1.gz rev.1.gz tbl.1.gz vlc.1.gz
col.1.gz fmt.l.gz lcf.i.gz mmd.1.gz rsh.1.gz tcc.1.gz who.1.gz
bender@ubuntu:/usr/share/man/man1$ set -x
bender@ubuntu:/usr/share/manman1$ ls -l [0-9]*
+ ls —color=auto -l 2to3.1.gz 2to3-2.7.1.gz 2to3-3.2.1.gz 411toppm.1.gz 7z.1.gz 7za.1.gz
lrwxrwxrwx 1 root root 13 июня 18 2018 2to3.1.gz -> 2to3-2.7.1.gz
-rw-r—r— 1 root root 563 февр. 28 2018 2to3-2.7.1.gz
-ГМ-Г—Г— 1 root root 2013 февр. 18 2017 7z.1.gz
-rw-r—r— 1 root root 2032 февр. 18 2017 7za.1.gz
bender@ubuntu:/usr/share/man/man1$ ls [!a-z0-9]*
+ ls —color=auto -l ‘[.1.gz’
lrwxrwxrwx 1 root root 9 нояб. 20 2017 [.1.gz -> test.1.gz
В режиме трассировки командного интерпретатора видна еще и подстановка псевдонимов, которая заменяет «псевдоним» команды пользователя, например ls, ее «настоящим значением».
Псевдонимы командного интерпретатора
bender@ubuntu: ~$ alias
alias ‘ls -CF’
alias la=’ls -A’
alias ll=’Is -alF’
alias ls=’ls — -color=auto’