Как программно создать перенаправление вывода в bash - PullRequest
0 голосов
/ 22 марта 2020

Я пишу тестовый скрипт, и в нем много повторений, и я ищу способы уменьшить это дублирование кода. Поэтому я подумал, что было бы неплохо программно создать часть команд перенаправления.

Вот минимальный пример: (В реальном скрипте я бы генерировал разные имена выходных файлов в x())

#!/bin/bash

set -x

x() {
  echo '> out.txt 2> err.txt'
}

./someProgram $(x)

Я надеюсь, что stdout окажется в out.txt и stderr в err.txt. Но bash цитирует строку. Таким образом, результирующая команда будет ./someProgram '>' out.txt '2>' err.txt вместо ./someProgram > out.txt 2> err.txt.

Вот результат примера:

++ x
++ echo '> out.txt   2> err.txt'
+ ./someProgram '>' out.txt '2>' err.txt
.....

Так что есть вероятность, что '>' и '2>' не будет цитироваться?

1 Ответ

2 голосов
/ 22 марта 2020

Трудно обходиться без большего контекста, но, вероятно, вы просто хотите разумно использовать exec. Я не буду ручаться за переносимость следующего, но в bash 5.0.16 вы можете сделать:

x() { shift; "$@"; } > $1.out 2> $1.err
x filename ./someProgram

Для запуска ./someProgram с выводом, направленным на filename.out и потоком ошибок записано filenmae.err

...