Как я могу работать “grep | grep” команда как строка в функции удара?

Webmin должен работать с большинством главных дистрибутивов, таких как CentOS, Debian и Ubuntu. Поскольку Вы переезжаете от тех, я ожидал бы, что это начнет уменьшаться.

Я нашел этот поток названным: Какой-либо лучший дистрибутив, чем CentOS для Webmin/Virtualmin?, который имеет несколько взглядов народов на использование Webmin на различных Ose. Одна вещь, с которой Вы, вероятно, столкнетесь, состоит в том, что Webmin мог бы иметь проблемы с различными сервисами, а не проблему с конкретным дистрибутивом.

Так, например, это могло бы работать отлично на Ubuntu, за исключением, возможно, сервиса Samba, на Ubuntu. Таким образом, в целом это работает просто великолепно с тем конкретным дистрибутивом, кроме с тем одним сервисом.

3
23.05.2017, 15:40
3 ответа
[114848]Как уже упоминалось в комментарии, ваша сложность заключается в том, что вы пытаетесь сохранить команду в переменную, а затем выполнить ее позже.[12230]Вам повезет гораздо больше, если вы просто запустите команду немедленно, а не пытаетесь ее сохранить.[12231]Например, это должно сделать то, что вы пытаетесь сделать:[12232]
4
27.01.2020, 21:16
[115805] Одно, что следует помнить о программировании в оболочке, которое часто не разъясняется четко в учебниках, состоит в том, что существует два типа данных: [116283] строки и списки строк[116284]. Список строк - это не то же самое, что строки с новой строкой или разделителем пробелов, это вещь своя.[12165]Другая вещь, которую следует помнить, это то, что большинство расширений применяется только при разборе файла в оболочке. Выполнение команды не подразумевает никакого расширения.[12166]Некоторое расширение происходит со значением переменной: [116285]$foo[116286] означает "взять значение переменной [116287]foo[116288], разделить ее на список строк, используя пробелы¹ в качестве разделителей, и интерпретировать каждый элемент списка как шаблон подстановки, который затем расширяется". Такое расширение происходит только в том случае, если переменная используется в контексте, вызывающем список. В контексте, вызывающем строку, [116289]$foo[116290] означает "взять значение переменной [116291]foo[116292]". Двойные кавычки накладывают контекст строки, отсюда и совет: [116293] всегда используют подстановку переменных и подстановку команд в двойных кавычках: [116551]"$foo"[116552], [116553]"$(somecommand)"[12167]². (Те же самые расширения случаются с незащищенными подстановками команд, что и с переменными.)[12168]². Следствием различия между разбором и выполнением является то, что вы не можете просто запихнуть команду в строку и выполнить ее. Когда вы пишете [116295]${grep_cmd}[116296], происходит только разбиение и глобус, а не парсинг, поэтому такой символ как [116297]|[116298] не имеет особого значения.[12169]Если вам абсолютно необходимо записать команду оболочки в строку, вы можете [116299]eval[116300] ее:[12170]Обратите внимание на двойные кавычки - значение переменной содержит команду оболочки, поэтому нам нужно ее точное значение в строке. Однако, такой подход имеет тенденцию быть сложным: вам действительно нужно что-то в исходном синтаксисе оболочки. Если вам нужно, скажем, имя файла, то это имя файла должно быть правильно процитировано. Поэтому нельзя просто поместить туда [116301]$pattern[116302] и [116303]$@[116304], нужно построить строку, которая при разборе приводит к одному слову, содержащему шаблон, и к списку слов, содержащих аргументы.[12171]Чтобы подвести итог: [116305]не набивать команды оболочки в переменные[116306]. Вместо этого [116307]используйте функции[116308]. Если вам нужна простая команда с аргументами, а не что-то более сложное, например, конвейер, вы можете использовать вместо нее массив (в переменной массива хранится список строк).[12172]Вот один возможный подход. Функция [116309]run_grep[116310] на самом деле не нужна с показанным кодом, я включил ее сюда в предположении, что это небольшая часть более крупного скрипта, а промежуточного кода намного больше. Если это действительно весь скрипт, просто запустите grep в том месте, где вы знаете, во что его вставлять. Я также исправил код, который строит фильтр, что казалось неправильным (например, [116311].[116312] в регеxp означает "любой символ", но я думаю, что вы хотите буквальную точку).[12173]¹ [116313] В общем, используя значение [116555]IFS[116556]. [12174]² [116316] Только для экспертов: всегда используйте двойные кавычки вокруг подстановок переменных и команд, если не понимаете, зачем их оставлять, что приводит к правильному эффекту. [12175]³ [116319] Только для экспертов: если вам нужно вставить команду оболочки в переменную, будьте очень осторожны с кавычками. [12176] Обратите внимание, что то, что вы делаете, кажется слишком сложным и ненадежным - что, если у вас есть файл, содержащий [116321]foo.c: 42[116322]? GNU grep имеет опцию [116323]--include[116324] для поиска только в определенных файлах в рекурсивном обратном пути - просто используйте ее.[12177]
1
27.01.2020, 21:16
command="grep $regex1 filelist | grep $regex2"
echo $command | bash
0
27.01.2020, 21:16

Теги

Похожие вопросы