Я сохранил следующую программу в new.c
int main()
{
a;
return 0;
}
Возвращает сообщение об ошибке. Я хочу отправить это сообщение в файл. Поэтому я использовал следующую команду
gcc new.c > temp.txt
Но все же я получал вывод на терминал. Я использую Ubuntu 13.04. Как я могу заставить это работать?
Ответы:
Когда вы компилируете программу
gcc
, есть разные виды вывода: tostdout
иstderr
. Как правило,>
будет направлятьstdout
поток в файл (например, результатprintf("hello world\n");
посылаетсяstdout
). Тем не менее, онstderr
продолжает отправляться на экран, поскольку предполагается, что это «нечто исключительное, о чем вам нужно рассказать».Существует способ перенаправить stderr в файл - вы делаете это с помощью следующей (не очень интуитивно понятной) команды:
где
&>
"стенограмма bash" для "перенаправить все". Как было отмечено @CharlesDuffy, POSIX-совместимая формаЭто означает «скомпилировать« new.c »и отправить
stdout
вmyFile
. И отправитьstderr
(2) в то же место, что иstdout
(&1
=« в том же месте, что и стандартный вывод »).Более подробную информацию о различных перенаправлениях вы найдете на http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html и http://mywiki.wooledge.org/BashFAQ/055.
Кстати, если вы хотите отправить что-то из вашей программы специально
stderr
, вы можете сделать это с помощью следующегоЕсли вы включите это в программу, запустите программу и отправите «нормальный» вывод в файл, он все равно появится на консоли. Так что если вы скомпилируете вышеперечисленное в исполняемый файл
urgent
, наберитена консоли ваш вывод появится на экране.
источник
>myFile 2>&1
), а также расширение bash (&>
).Поскольку
>
перенаправляет только стандартный вывод, и ошибки записываютсяstderr
, вам нужно использовать одно из следующих:...или...
&>
расширение BASH, которое перенаправляетstdout
иstderr
в файл; в противном случае, самый простой подход к первому перенаправлять стандартный вывод (>temp.txt
), а затем сделать STDERR (FD 2) копия уже перенаправлены дескриптора файла на стандартный вывод (FD 1), например , так:2>&1
.источник
Как уже говорили другие, linux предоставляет два разных потока вывода:
stdout , или «стандартный вывод» - это то, куда идет весь обычный вывод.
Вы можете ссылаться на него, используя файловый дескриптор
1
.stderr , или «стандартная ошибка» - это отдельный поток для внеполосной информации.
Вы можете ссылаться на него, используя файловый дескриптор
2
.Почему два разных выходных потока? Рассмотрим конвейер воображаемых команд:
Теперь представьте, что
decrypt
команда не работает и генерирует сообщение об ошибке. Если бы он отправил это сообщениеstdout
, он бы отправил в канал, и если бы у него не было слова «секрет», вы бы его никогда не увидели. Таким образом, вы получите пустой выходной файл, не зная, что пошло не так.Однако, поскольку канал захватывает только
stdout
,decrypt
команда может отправлять свои ошибки тудаstderr
, где они будут отображаться на консоли.Вы можете перенаправить
stdout
иstderr
, вместе или независимо:Вы можете перенаправить ошибки
stdout
и обработать их, как если бы они были обычным выводом:Вы также можете использовать сокращенную запись для перенаправления как stdout, так и stderr в один и тот же файл:
И, наконец,
>
оператор сначала обрезает свой выходной файл перед записью в него. Если вместо этого вы хотите добавить данные в существующий файл, используйте>>
оператор:источник
$FOO
) является распространенным источником ошибок, и демонстрация его в примерах не так уж велика. (2) Использование имен переменных в верхнем регистре является основной причиной конфликтов пространства имен между средой и встроенными переменными (прописными буквами по соглашению) и локальными переменными (строчными буквами по соглашению). (3) Поощрение людей к повторному использованию>>
(которое открывает файл каждый раз, когда он используется в команде) вместо того, чтобы открывать файл один раз и оставлять дескриптор файла открытым для использования несколькими командами, приводит к неэффективному коду.exec 4>secrets; echo "this is a secret" >&4; echo "this is another secret" >&4
exec
для простоты, хотя на практике это, как правило, лучшая стратегия.command₁
>
output_file
;
command₂
>>
the_same_output_file
(
command₁
;
command₂
) >
output_file
{
command₁
;
command₂
; } >
output_file
{
;
}