Как перенаправить вывод команды в файл, когда команда будет запрашивать ввод пользователя?
У меня есть команда, которая предложит пользователю ввести некоторые данные, а затем вывести результат на терминал. Я набрал команду, как показано ниже, чтобы перенаправить вывод в файл:
$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 из многих источников в Интернете.
- Как предположил Scott в своем комментарии, есть вики-ответ Unix SE: хорошая отправная точка.
- Должен
man bash
или руководство по bash. - Я нашел полезной главу о перенаправлении bash-хакеров, где вы также можете найти ссылки на устаревшие приложения.
- Вы также можете обратиться к Расширенному руководству по написанию сценариев, глава 20.
По умолчанию только STDOUT
перенаправлен и / или передан по трубопроводу. Что вы хотите, чтобы уйти STDOUT
один, и есть то, что передается через STDIN
перенаправлены.
Если редактирование the_command
это вариант, вы можете убедиться, что вопрос выводится на STDERR
вместо этого (это должно вывести его на экран независимо от каких-либо перенаправлений), а затем заставить его отображать эхо, которое пользователь вводит обратно на экран через STDOUT
,
Обычно есть 2 важных выходных канала: STDOUT
(для обычного вывода) и STDERR
(для сообщений об ошибках).
Проблема здесь в том, что "обычный" вывод команды и текст приглашения записываются в STDOUT
поэтому они всегда помещаются в одно и то же место. Когда вы используете ваше перенаправление, это просто занимает все STDOUT
, включая подсказку.
Если перезапись (как предложено в другом ответе Jarmund) команды не представляется возможной, возможно, команда имеет дополнительную опцию / флаг (например, --output
), что может указать какой-то выходной файл вместо использования перенаправления?