Строка exec из файла в bash

Я пытаюсь читать команды из текстового файла и выполнять каждую строку из сценария bash.

#!/bin/bash
while read line;    do 
     $line
done < "commands.txt"

В некоторых случаях if $ line содержит команды, которые предназначены для запуска в фоновом режиме, например command 2> & 1 & они не будут запускаться в фоновом режиме и будут выполняться в текущем контексте сценария.

Любая идея почему?

10
задан Mark Elliot 28 August 2010 в 02:53
поделиться

2 ответа

если все ваши команды находятся внутри "commands.txt", по сути, вы можете назвать это скриптом оболочки. Вот почему вы можете либо получить его, либо запустить как обычно, например, chmod u+x , затем вы можете выполнить его, используя sh commands.txt

11
ответ дан 3 December 2019 в 23:10
поделиться

Мне нечего добавить к ответу ghostdog74 о правильном способе сделать это, но я могу объяснить, почему он терпит неудачу: оболочка анализирует перенаправления ввода-вывода, фоновую обработку и многое другое. других вещей, прежде чем он выполнит расширение переменной, поэтому к тому времени, когда $line будет заменен на command 2>&1 &, уже слишком поздно распознавать 2>&1 и & как что угодно, кроме параметров команды .

Вы можете улучшить это, используя eval "$line", но даже в этом случае вы столкнетесь с проблемами с многострочными командами (например, циклами while, блоками if и т. д.). Подходы source и sh не имеют этой проблемы.

3
ответ дан 3 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

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