Перенаправление Stderr и Stdout в файл не сохраняет исходную строку no из скрипта - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть скрипт как

#!/bin/bash
exec 3>&1 4>&2
exec 1>/tmp/stdout.log
exec 2>/tmp/stderr.log
echo "This goes to /tmp/stdout.log"
echo "This goes to /tmp/stderr.log" 1>&2       
cmd1="$(uname -a)"
cmd2="$(uname +-a)"
exec 1>&3 2>&4
exec 3>&- 4>&-

, когда я открываю stderr Я получаю

This goes to /tmp/stderr.log
uname: extra operand `+-a'
Try `uname --help' for more information

Почему бельё не добавляется с stderr?Есть ли способ, где я могу добавить fileno информацию в файл ошибок, а также.Благодаря.

1 Ответ

1 голос
/ 19 апреля 2019

На самом деле вы не можете получить автоматические номера строк, но если вы хотите, чтобы какой-то вывод помог вам сориентироваться, вы можете использовать xtrace logging с номером строки в PS4. Это будет чередовать журнал с командами и номерами строк, которые выполняются:

#!/bin/bash
exec 3>&1 4>&2
exec 1>/tmp/stdout.log
exec 2>/tmp/stderr.log
PS4='+ (Line $LINENO) '
set -x
echo "This goes to /tmp/stdout.log"
echo "This goes to /tmp/stderr.log" 1>&2
cmd1="$(uname -a)"
cmd2="$(uname +-a)"
exec 1>&3 2>&4
exec 3>&- 4>&-

Вот журнал ошибок, показывающий выполненные команды и номера строк, чтобы вам было легче видеть, откуда берется +-a:

+ (Line 7) echo 'This goes to /tmp/stdout.log'
+ (Line 8) echo 'This goes to /tmp/stderr.log'
This goes to /tmp/stderr.log
++ (Line 9) uname -a
+ (Line 9) cmd1='Linux localhost 4.14.0-3-amd64 #1 SMP Debian 4.14.17-1 (2018-02-14) x86_64 GNU/Linux'
++ (Line 10) uname +-a
uname: extra operand ‘+-a’
Try 'uname --help' for more information.
+ (Line 10) cmd2=
+ (Line 11) exec
...