Вопрос или проблема
Я хочу сохранить весь вывод компиляции в файл. У меня много ошибок неопределенная ссылка
, и я хочу видеть все эти ошибки. Я пробовал makeall >& out
, но в файле out
нет никаких ошибок неопределенная ссылка
.
Я должен использовать csh
для запуска makeall
.
Вы пробовали makeall |& tee out
? Это должно выводить все на экран, а также в файл out
.
Судя по вашим комментариям, очевидные решения не работают. Пожалуйста, попробуйте это: sh -c 'makeall >out 2>&1'
(вам, возможно, нужно будет изменить часть с makeall
, чтобы указать полный путь, или добавить различные флаги; просто убедитесь, что это все внутри одинарных кавычек).
Если это приведет к ошибке, пожалуйста, предоставьте ее здесь.
Если ошибки нет, но вы все равно не получаете свои ошибки компиляции в файле out, тогда ваш скрипт makeall
почти наверняка делает что-то очень странное с файловыми дескрипторами stdout и stderr.
Если ваш скрипт makeall
сам перенаправляет stderr на терминальное устройство или на /dev/tty
, то никакое перенаправление stderr от makeall
не поможет.
Поскольку поддержка перенаправления в csh очень ограничена по сравнению с оболочками вроде Bourne или rc, не редкость увидеть такие конструкции:
cmd >& /dev/null > /dev/tty
Чтобы перенаправить только stderr (при этом перенаправляя stdout
на tty, предполагая, что он был таким, каким был раньше).
Или:
(cmd1; cmd2 >& /dev/tty; cmd3) >& file.log
Для того, чтобы cmd2
не подвергался перенаправлению в лог-файл.
Теперь, поскольку перенаправление там сделано явно на /dev/tty
, наш единственный вариант – сделать так, чтобы /dev/tty
шло в ваш файл out
.
Для этого вы можете использовать псевдотерминал, который станет stdout и stderr вашей команды makeall
.
Для этого вы можете использовать script
. С реализациями из util-linux
по крайней мере:
script -qec 'stty raw -echo; exec makeall' out >& /dev/null
Замените >& /dev/null
на < /dev/null
(чтобы избежать того, что script
также поставит терминал хоста в режим raw), чтобы также видеть вывод и ошибки (в дополнение к тому, что это будет записываться в файл out
).
Ответ или решение
Чтобы сохранить весь вывод компиляции, включая ошибки, в файл, вы можете воспользоваться различными методами. Важно понимать, что при использовании csh
имеем некоторые ограничения по сравнению с другими оболочками, такими как bash
.
Сохранение вывода и ошибок при помощи csh
-
Проверка скрипта makeall:
Прежде чем использовать какие-либо команды, убедитесь, что сам скриптmakeall
не перенаправляет стандартный вывод (stdout
) и стандартный поток ошибок (stderr
) на консоль или специальное устройство, такое как/dev/tty
. Если это происходит, перенаправление, которое вы применяете, не будет иметь эффекта. -
Использование команды script:
Если вашmakeall
действительно перенаправляет вывод, вы можете использовать командуscript
. Она позволяет записывать вывод, как если бы он был на терминале.script -qec 'makeall' out
В этой команде:
-q
отключает вывод сообщений командной строки.-e
позволяет завершить сессию скрипта, если произойдет ошибка.makeall
— это ваш скрипт, который вы хотите выполнить.out
— файл, в который будет сохранен весь вывод.
Этот способ позволяет увидеть весь вывод, включая ошибки, и сохранит его в указанный файл
out
. -
Перенаправление вывода:
Если вы хотите явно перенаправить стандартный вывод и поток ошибок в файл, используйте следующую команду:makeall > out 2>&1
Здесь:
>
— перенаправляет стандартный вывод в файлout
.2>&1
— перенаправляет стандартный поток ошибок (дескриптор 2) в тот же поток, что и стандартный вывод (дескриптор 1).
Возможные ошибки и рекомендации
Если вы по-прежнему не видите ошибки undefined reference
в файле out
, это может указывать на то, что makeall
действительно перенаправляет выходные данные на /dev/tty
. В таком случае есть несколько решений:
- Убедитесь, что в самом скрипте
makeall
нет перенаправлений, которые исключают стандартный поток ошибок. - Если это так, вам нужно будет вручную изменить этот скрипт, чтобы сделать вывод более доступным, или использовать команду
script
, как было описано выше.
Заключение
С использованием команды script
и правильного перенаправления потоков вы сможете захватить весь вывод и ошибки вашего компиляционного процесса. Убедитесь, что ваш скрипт makeall
не вмешивается в стандартные механизмы вывода. Если у вас возникли трудности, попробуйте проверить код скрипта на наличие нестандартных перенаправлений.