7

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

$the_command > abc.txt

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

3 ответа3

3

По умолчанию только STDOUT перенаправляется и / или передается по каналу. Вам нужно оставить STDOUT покое и перенаправить все, что передается через STDIN .

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

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 из многих источников в Интернете.

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .