як виконати рядки, що виходять із результату grep?


10

У мене є текстовий файл з певними інструкціями по встановленню, і я знаю, що можу привітатися за унікальне явище у файлі. Наприклад, текстовий файл має щось на зразок:

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

В bash, як я можу виконати рядки після грейпу у файлі? Щось на зразок:

виконати результат від "grep somedir INSTALLFILE"
виконати результат від "grep" експорту PERL5LIB "INSTALLFILE"

2
Хіба автоматичне виконання таким чином не є небезпечним для підлітків?
Faheem Mitha

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 <(...)вам потрібен удар 4 або вище. Він не працював із більш старими версіями (хоч zsh було нормально).
Стефан Шазелас

11

Для оцінки рядків в окремому процесі оболонки:

grep somedir INSTALLFILE | sh

Для оцінки рядків у процесі запущеної оболонки:

eval "$(grep somedir INSTALLFILE)"

+1 за те, що єдиний бачив ліс крізь дерева. Цим видаляю свою відповідь. @avilella: для зручності ви можете використовувати -A 1або -B 1як прапорці на одному чи другому вашому greps, щоб отримати обидві лінії одним грепом і використовувати це в будь-якому з рішень @Gilles.
Калеб

Зауважте, що в деяких системах shможе бути символьне посилання на іншу оболонку замість тієї, яку ви очікували, тому результати можуть бути непередбачуваними. Щоб бути в безпеці, grep somedir INSTALLFILE | bash
вкажіть

-2

Чи вирішили ви використовувати функцію 'exec' знаходження як у:

find somedir -name INSTALLFILE -exec {}\;

Я думаю, що ОП прагне виконати результати, які повертаються з grom grep, а не запускати кожен результат, який повертається з пошуку.
Калеб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.