Как выполнить строки из результата grep?

10

У меня есть текстовый файл с определенными инструкциями по установке, и я знаю, что могу найти уникальный случай в файле. Например, текстовый файл имеет что-то вроде:

MYDIR = `find / home / user -name somedir`
экспорт PERL5LIB = $ PERL5LIB: $ MYDIR

В bash, как я могу выполнить строки после grep в файле? Что-то типа:

выполнить результат из "grep somedir INSTALLFILE"
выполнить результат из "grep" export PERL5LIB 'INSTALLFILE "
719016
источник
2
Разве автоматическое выполнение таким образом не слишком опасно?
Фахим Митха
2
@Faheem и @avilella: более чем немного, довольно опасно! Также несколько хрупкий.
Калеб

Ответы:

4

Предположения:

  • у вас есть контроль над этим файлом и вы не подвержены риску вредоносного кода
  • Вы хотите установить эти переменные вашей текущей оболочки

Вы можете перенаправить ваши команды во временный файл и выполнить это:

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

Или вы можете оценить результаты

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

Обновление старого ответа. Сегодня я бы использовал замену процесса:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)
Гленн Джекман
источник
Обратите внимание, что для source <(...), вам нужен Bash 4 или выше. Это не работало со старыми версиями (хотя zsh был в порядке).
Стефан Шазелас
11

Чтобы оценить строки в отдельном процессе оболочки:

grep somedir INSTALLFILE | sh

Чтобы оценить строки в запущенном процессе оболочки:

eval "$(grep somedir INSTALLFILE)"
Жиль "ТАК - перестань быть злым"
источник
+1 за то, что единственный, кто видел лес сквозь деревья. Тем самым удаляя мой ответ. @avilella: для удобства вы можете использовать -A 1или в -B 1качестве флагов на одном или другом из ваших greps, чтобы получить обе строки одним grep и использовать это в любом из решений @Gilles.
Калеб
Обратите внимание, что в некоторых системах shможет быть символическая ссылка на другую оболочку вместо той, которую вы ожидали, поэтому результаты могут быть непредсказуемыми. Чтобы обезопасить себя , конкретные точные оболочки вы ожидаете, напримерgrep somedir INSTALLFILE | bash
thdoan
-2

Рассматривали ли вы возможность использования функции exec в find как в:

find somedir -name INSTALLFILE -exec {}\;
zedman9991
источник
Я думаю, что OP ищет результаты, которые возвращаются grom grep, а не запускает каждый результат, возвращаемый из find.
Калеб