Как перенаправить ошибку в файл?

единственным путем я могу думать, со сценарием или макросом. Я, вероятно, сделал бы это с Python, так как это - то, с чем я более знаком, но существует некоторая полезная информация о том, как сделать это в OOBasic здесь.

5
19.10.2012, 15:25
2 ответа

Строка, которая вызывает ошибку, date =$(date), та ошибка отправляется в stderr. На том этапе Вы не перенаправляете stderr нигде. Последующая строка отправляет stderr в $filename, но не случается так, что строка, которая вызывает ошибку.

Один из способов получить эффект, который Вы хотите, Вы запустили бы свой скрипт и прямой stderr к где-то в другом месте одновременно, таким образом,

./myscript 2>> errors.txt

в той точке errors.txt будет содержать Вашу ошибку.

Таким образом, проблема, строка, генерирующая ошибку, является ошибкой в самом сценарии, не ошибка, вызванная внешней командой вызовы сценария, который имеет, это произвело перенаправленный. т.е. это - высокоуровневый сценарий, производит Вас, должен перенаправить.

8
27.01.2020, 20:35
  • 1
    Другая стратегия состояла бы в том, чтобы окружить несколько строк в Вашем сценарии с {...} 2>> errors.txt или (...) 2>> errors.txt. Второе менее эффективно, но ведет себя способами, которые полезны при определенных обстоятельствах. (Читайте о "подоболочках" для узнавания больше.) –  dubiousjim 19.10.2012, 17:20

Оболочка испускает сообщение об ошибке, когда она достигает строки 5. Поток сообщений об ошибках оболочки не перенаправляется в этой точке.

Если Вы пишете date= $(date) 2>/dev/null, “команда, не найденная” сообщение, прибывает из оболочки, не из команды, поток сообщений об ошибках которой перенаправляется. Поэтому Вы будете все еще видеть сообщение об ошибке.

Чтобы постараться не видеть сообщение об ошибке, поместите целую команду в группе и перенаправьте поток сообщений об ошибках от целой группы:

{ date= $(date); } 2>/dev/null

С фигурными скобками команда все еще выполняется в родительской оболочке, таким образом, она может изменить свою среду и другое состояние (не, что она делает здесь). Можно также поместить команду в тело функции, или в подоболочку (команды в круглых скобках, которые выполняются в отдельном процессе оболочки).

Можно перенаправить дескрипторы файлов оболочки постоянно (или по крайней мере до в следующий раз, когда Вы изменяете их) при помощи перенаправления на exec встроенный без названия команды.

exec 2>/dev/null
# From this point on, all error messages are lost
date= $(date)
…
exec 2>/some/log/file
# From this point on, all error messages go to the specified file
2
27.01.2020, 20:35
  • 1
    Спасибо за предложение альтернатив. Что {} названный в ударе. Я знаю <() и $() процесс и замена команды соответственно, но не {}. –  ronnie 20.10.2012, 09:54

Теги

Похожие вопросы