Переключение между "|" и символы «&&» в команде, основанной на вводе - PullRequest
2 голосов
/ 28 мая 2020

Я использую сценарий bash, чтобы объединить выполнение ряда программ. Каждая из этих программ производит вывод и имеет два флага, которые могут быть установлены как -iInputFile.txt и -oOutputFile.txt. Если флаг не установлен, то автоматически выбираются стандартный ввод и вывод. В большинстве случаев я просто объединяю свои программы как

./Program1 | ./Program2 | ./Program3

, но если мне понадобится сохранить данные в файл, а затем получить к нему доступ из следующего файла, мне нужно сделать

./Program1 | ./Program2 -oFile.txt && ./Program3 -iFile.txt

, поэтому мой вопрос в том, есть ли способ предоставить ввод, например 010, и только преобразовать символы между сценарием 2 и 3 из | в &&, оставив все остальное нетронутым. Жесткое кодирование было бы невозможно, так как у меня объединено до 12 программ, так что получилось бы даже 12! комбинации. Я спрашиваю впервые, поэтому, если что-то неясно из вопроса, который я отредактирую, чтобы предоставить любую необходимую информацию, заранее всем спасибо.

1 Ответ

3 голосов
/ 28 мая 2020

Если вы пишете это в сценарии, вы можете жестко запрограммировать tee между конвейером и использовать расширение параметра значения по умолчанию bash, чтобы отключить функцию записи в файл

./Program1 | tee ${outFile1:- /dev/null} | ./Program2 | tee ${outFile2:- /dev/null} | \
    ./Program3 | tee ${outFile3:- /dev/null}

Обратите внимание, что последний вызов tee может быть лишним

Proof of Concept

$ unset outFile; echo foo | tee ${outFile:- /dev/null} | cat - && cat ./tmp
foo
cat: ./tmp: No such file or directory
$ outFile=./tmp; echo foo | tee ${outFile:- /dev/null} | cat - && cat ./tmp
foo
foo
...