Как перенаправить вывод команды в файл, когда команда будет запрашивать ввод пользователя?

У меня есть команда, которая предложит пользователю ввести некоторые данные, а затем вывести результат на терминал. Я набрал команду, как показано ниже, чтобы перенаправить вывод в файл:

$the_command > abc.txt

Но это не работает. Проблема в том, что подсказок нет, текст этих подсказок выводится в abc.txt, а не тот результат, который мне нужен.

3 ответа

Решение

Ваша команда работает и правильно перенаправляет вывод в файл abc.txt,
Вопрос в том, как ваш скрипт запрашивает входные данные и как вы запускаете скрипт?
Давайте посмотрим на два примера:

# Script_1.sh                                     # 1
echo Please, enter your firstname and lastname    # 2
read FN LN                                        # 3
echo "Hi! $LN, $FN !"                             # 4

а также

# Script_2.sh                                     # 5
read -p "Enter a comment " CM                     # 6
echo  "You said $CM"                              # 7

Если вы бежите /bin/bash Script1.sh > abc.txt Вы не увидите вопрос "Пожалуйста, введите..." на вашем TTY. Если вы дадите ожидаемый ввод с клавиатуры, вы найдете вывод строки № 2 и № 4 в вашем abc.txt файл.

Если вы бежите /bin/bash Script2.sh > abc.txt вы увидите вопрос "Введите комментарий", но вы найдете в abc.txt подать только вывод строки #7.

Примечание: если вы запускаете Script2,sh в подоболочке

(bash Script2.sh 2>&1)> abc.txt

вы не увидите никакого вывода на tty, и вы найдете все в abc.txt файл.
Если вы запустите его с

bash Script2.sh 2>ccc.txt 1>ddd.txt`

Вы найдете стандартный вывод (строка № 7) в ddd.txt и стандартная ошибка (строка № 6) в ccc.txt,


Если вы хотите перенаправить только часть вывода вашей команды, вы должны изменить свой скрипт.
Один из способов сделать это - создать функцию для перемещения части скрипта, которая будет генерировать интересный вывод (см. Ниже). Затем вы можете вызвать эту функцию из основной части вашего скрипта (где изначально был код, который вы переместили в функцию), перенаправив только этот вывод в файл журнала:

 Part_To_Redirect(){
     : # all that you want
 }

 # ... Main part of the script
 # point where it was the part that generates the output
 Part_to_Redirect "$@" > abc.txt   # this to store only that part in the file
 # Part_to_Redirect "$@" >> abc.txt  # this to append that part in the file
 # ...

Вы должны даже найти полезное tee тот

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

 the_command  | tee abc.txt       # To redirect Standard output
 or 
 the_command 2>&1 | tee abc.txt   # To redirect err in out and both in the file

В этом случае у вас будут обычные выходные данные вашей команды на tty, но в то же время вы сохраните копию в файле журнала. abc.txt, В вашем случае должно быть уютно, если вы используете read -p как в script2 вызов the_command | tee abc.txt,

Примечания и ссылки:

Добавление "$@" Вы можете передать все аргументы вашего скрипта в функцию.

Возможно, вам будет интересно узнать больше о bashredirection из многих источников в Интернете.

По умолчанию только STDOUT перенаправлен и / или передан по трубопроводу. Что вы хотите, чтобы уйти STDOUT один, и есть то, что передается через STDIN перенаправлены.

Если редактирование the_command это вариант, вы можете убедиться, что вопрос выводится на STDERR вместо этого (это должно вывести его на экран независимо от каких-либо перенаправлений), а затем заставить его отображать эхо, которое пользователь вводит обратно на экран через STDOUT,

Обычно есть 2 важных выходных канала: STDOUT (для обычного вывода) и STDERR (для сообщений об ошибках).

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

Если перезапись (как предложено в другом ответе Jarmund) команды не представляется возможной, возможно, команда имеет дополнительную опцию / флаг (например, --output), что может указать какой-то выходной файл вместо использования перенаправления?

Другие вопросы по тегам