CSH и весь вывод (с ошибками) в файл

Вопрос или проблема

Я хочу сохранить весь вывод компиляции в файл. У меня много ошибок неопределенная ссылка, и я хочу видеть все эти ошибки. Я пробовал 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

  1. Проверка скрипта makeall:
    Прежде чем использовать какие-либо команды, убедитесь, что сам скрипт makeall не перенаправляет стандартный вывод (stdout) и стандартный поток ошибок (stderr) на консоль или специальное устройство, такое как /dev/tty. Если это происходит, перенаправление, которое вы применяете, не будет иметь эффекта.

  2. Использование команды script:
    Если ваш makeall действительно перенаправляет вывод, вы можете использовать команду script. Она позволяет записывать вывод, как если бы он был на терминале.

    script -qec 'makeall' out

    В этой команде:

    • -q отключает вывод сообщений командной строки.
    • -e позволяет завершить сессию скрипта, если произойдет ошибка.
    • makeall — это ваш скрипт, который вы хотите выполнить.
    • out — файл, в который будет сохранен весь вывод.

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

  3. Перенаправление вывода:
    Если вы хотите явно перенаправить стандартный вывод и поток ошибок в файл, используйте следующую команду:

    makeall > out 2>&1

    Здесь:

    • > — перенаправляет стандартный вывод в файл out.
    • 2>&1 — перенаправляет стандартный поток ошибок (дескриптор 2) в тот же поток, что и стандартный вывод (дескриптор 1).

Возможные ошибки и рекомендации

Если вы по-прежнему не видите ошибки undefined reference в файле out, это может указывать на то, что makeall действительно перенаправляет выходные данные на /dev/tty. В таком случае есть несколько решений:

  • Убедитесь, что в самом скрипте makeall нет перенаправлений, которые исключают стандартный поток ошибок.
  • Если это так, вам нужно будет вручную изменить этот скрипт, чтобы сделать вывод более доступным, или использовать команду script, как было описано выше.

Заключение

С использованием команды script и правильного перенаправления потоков вы сможете захватить весь вывод и ошибки вашего компиляционного процесса. Убедитесь, что ваш скрипт makeall не вмешивается в стандартные механизмы вывода. Если у вас возникли трудности, попробуйте проверить код скрипта на наличие нестандартных перенаправлений.

Оцените материал
Добавить комментарий

Капча загружается...