Подстановочные знаки в качестве параметров оболочки - PullRequest
0 голосов
/ 21 мая 2018

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

ls /[!\(][!\(][!\(]/

Команда приводит к следующему выводу

...
com.apple.launchd.AIPZ6SAfpO
com.apple.launchd.HarlOx3LWS
com.apple.launchd.VmTi5KDz1h
powerlog

/usr/:
X11     include     libexec     sbin        standalone
bin     lib     local       share

/var/:
agentx      empty       log     netboot     rwho
at      folders     ma      networkd    spool
audit       install     mail        root        tmp
backups     jabberd     msgs        rpc     vm
db      lib     mysql       run     yp

Насколько я понимаю, это должно совпадать с каждым трехсимвольным именем папки, не содержащей косую черту /[!\(][!\(][!\(]/

Но почему я могу использовать его в качестве параметра?

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Потому что так работает оболочка.Любые аргументы, содержащие (не заключенные в кавычки) глобальные символы / выражения, расширяются до имен файлов.Это то, что происходит, скажем, rm *.txt (поскольку * является символом глобуса), и это то, что происходит в ls /[!\(][!\(][!\(]/ (так как [abc] является выражением глобуса).

Они не являются регулярнымивыражения, хотя.См., Например, https://mywiki.wooledge.org/glob для синтаксиса.

0 голосов
/ 23 мая 2018

Не, вы не знаете .... шаблоны оболочки описаны в glob(3), а регулярные выражения (более сложная концепция) описаны в regex(3) Две разные библиотеки, используемые для аналогичных целей.sh(1) вообще не использует регулярные выражения при замене параметров.Используется только библиотека glob(3).

0 голосов
/ 21 мая 2018

Вы не можете использовать регулярные выражения в качестве параметров (или, скорее, оболочка не будет обрабатывать строку как регулярное выражение при помещении в параметр). без кавычек glob /[!\(][!\(][!\(]/ соответствует в следующем порядке:

  1. Косая черта.
  2. Три символа, которыене являются начальными скобками.
  3. Косая черта.

Другими словами, трехбуквенные корневые каталоги, нигде не содержащие (.


Оболочка расширяет глобусов до нуля (например, в случае нулевого блога Баша) или более аргументов, которые могут быть переданы execve, как в этой команде:

$ strace -fe execve echo *
execve("/usr/bin/echo", ["echo", "directory1", "directory2"], 0x7ffcff705ce8 /* 44 vars */) = 0
...