Я пытаюсь читать команды из текстового файла и выполнять каждую строку из сценария bash.
#!/bin/bash
while read line; do
$line
done < "commands.txt"
В некоторых случаях if $ line
содержит команды, которые предназначены для запуска в фоновом режиме, например command 2> & 1 &
они не будут запускаться в фоновом режиме и будут выполняться в текущем контексте сценария.
Любая идея почему?
если все ваши команды находятся внутри "commands.txt", по сути, вы можете назвать это скриптом оболочки. Вот почему вы можете либо получить его, либо запустить как обычно, например, chmod u+x , затем вы можете выполнить его, используя sh commands.txt
Мне нечего добавить к ответу ghostdog74 о правильном способе сделать это, но я могу объяснить, почему он терпит неудачу: оболочка анализирует перенаправления ввода-вывода, фоновую обработку и многое другое. других вещей, прежде чем он выполнит расширение переменной, поэтому к тому времени, когда $line
будет заменен на command 2>&1 &
, уже слишком поздно распознавать 2>&1
и &
как что угодно, кроме параметров команды .
Вы можете улучшить это, используя eval "$line"
, но даже в этом случае вы столкнетесь с проблемами с многострочными командами (например, циклами while, блоками if и т. д.). Подходы source
и sh
не имеют этой проблемы.