Подстановки имен файлов в ОС linux

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

Простейшими вычисляемыми командным интерпретатором значениями являются имена файлов, соответствующие некоторым шаблонам. Язык шаблонных выражений крайне прост и основывается на понятии метасимволов, т. е. символов со специальными значениями (таблица ниже).

Шаблонные метасимволы

Метасимвол Значение
? Любой один символ
* Любое количество любых других символов
[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’

Добавить комментарий