4

Предположим, у вас есть файл с какой-то терминальной командой. Как каждая строка может быть выполнена? Можете ли вы направить вывод большего в eval?

%> more ./foo.txt

Редактировать:

После некоторой помощи / руководства из комментариев, я думаю, что я должен также отметить, что прошло много времени с тех пор, как я сделал какие-либо сценарии оболочки, поэтому, говоря « eval я могу иметь в виду « echo или какой-то другой способ выполнения кода.

Если foo.txt содержит различные строки кода, но я хочу выполнить строку, содержащую echo 'bar bar' , я ищу способ сделать это, скажем, из grep . Что-то логически похожее на:

grep echo foo.txt | xargs echo

1 ответ1

5

Если вам просто нужно оценить каждую строку файла, вам не нужно сложное перенаправление eval или stdout . Два простых варианта:

  • Исходный файл (source filename.sh или . filename.sh).
  • Сделайте файл исполняемым и запустите его (chmod +x filename.sh; ./filename.sh)

Если вам действительно нужно eval каждую строку файла в цикле, сделайте это с помощью while:

while IFS= read -r line; do eval "$line"; done < filename.sh

Вы также можете направить вывод любой команды в while:

grep foo filename.sh | while IFS= read -r line; do eval "$line"; done

Если вам нужно передать что-то source (или .), Который ожидает имя файла в качестве аргумента, вы можете использовать подстановку процесса:

source <( grep foo filename.sh )

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .