Использование функции поиска нескольких имен команды linux в переменной?

Оболочка, выполняющая сценарий, не является -интерактивной оболочкой.

Не -интерактивная оболочка все еще может использовать, например. readдля чтения данных со стандартного ввода.

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

Текст сбивает с толку, потому что слово «интерактивный» используется для обозначения двух вещей:

  1. Оболочка, которая была запущена для выполнения сценария оболочки, не является -интерактивной (в том смысле, что у нее нет контроля над заданиями, она сама по себе не выдает подсказку по умолчанию и т. д. и т. д. ). Это технический термин для типа оболочки, такой же, как «оболочка входа» и «интерактивная оболочка».
  2. Действие по сбору данных этим же сценарием может быть «интерактивным» (, если не происходит чтение, например, из. трубка или напильник ). Но опять же, любую команду, которая берет данные из стандартного ввода, можно назвать интерактивной. tr 'a-z' 'A-Z'сам по себе «интерактивно» превратит все строчные символы ASCII в прописные.
0
31.12.2019, 21:51
3 ответа

Да, это возможно. С помощью метода, который я покажу ниже, позаботьтесь об использовании кавычек, подстановочных знаков и т. д. Тем не менее, вот одно решение вBASH:

opt="-iname '*.srt' -o -iname '*.mp4'"
find. \( $(eval echo ${opt}) \)

Хотя невозможно просто вызвать переменную ${opt}в команде find, мы можем обойти это, используя команду evalв строке $(eval echo ${opt}).

-3
28.01.2020, 02:38

В реализации GNU findесть еще один способ поиска по нескольким именам файлов:

rgx='.*\.srt\|.*\.mp4'
find. -iregex "$rgx"

\|является логическим ИЛИ (в типах регулярных выражений GNU по умолчанию find, которые являются типами emacs ). Голый .означает любой уголь. а точка \..

Вы можете определить $rgx_comprи $rgx_media, а затем объединить их:

find. -iregex "$rgx_compr" -o -iregex "$rgx_media"

Здесь я опустил скобки.

2
28.01.2020, 02:38

Поскольку вы используете оболочку, которая поддерживает переменные-массивы (, то есть bash), вы можете создать переменную-массив и использовать ее напрямую.

Постоянное выражение

find. \( -iname "*.srt" -o -iname "*.mp4" \)...

Переменное выражение

opts=(-iname "*.srt" -o -iname "*.mp4")
find \( "${opts[@]}" \)...

Или

opts=( '(' -iname "*.srt" -o -iname "*.mp4" ')' )
find "${opts[@]}"...

Обратите внимание, что само раскрытие переменной массива должно быть заключено в двойные -кавычки ("${opts[@]}"), даже если оно содержит один или несколько элементов. Если массив не содержит элементов, он расширится до ничего(не пустая строка,"").

2
28.01.2020, 02:38

Теги

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