Стандартная ошибка для стандартного вывода -Есть ли другие варианты помимо перенаправления?

Две вещи:

  1. Как стив (расплывчато )сказал , похоже, вы пытаетесь изменить контекст каталогов, которые еще не существуют. Вы показали нам mkdir default; вам также необходимо создать elm.lt.unt.eduи elm-vh.lt.unt.edu.

  2. Похоже, вы на самом деле сказали

    sudo chcon -R -t httpd_sys_content_t elm.lt.unt.edu/elm-vh.lt.unt.edu/
    
    , хотя должны были сказать
    sudo chcon -R -t httpd_sys_content_t elm.lt.unt.edu/ elm-vh.lt.unt.edu/
    
    (с пробелом между двумя именами каталогов ).

-5
03.10.2020, 01:42
2 ответа

«Стандартная ошибка» не является конкретно определенным местом. «Стандартная ошибка» — это то, к чему прикреплен файловый дескриптор 2.

Когда вы перенаправляете «стандартную ошибку» в «стандартный вывод», вы закрываете файловый дескриптор 2, а затем снова открываете его как дубликат файлового дескриптора 1, так что он присоединяется к любому файловому дескриптору 1, который оказывается привязан к этому моменту. Исходный дескриптор файла 2 потерян (буквально, дескриптор файла закрыт ). Таким образом, вы не можете точно делать то, что вы хотите сделать. Если вы перенаправляете «стандартную ошибку» куда-то еще, файловый дескриптор 2 закрывается (и снова открывается, чтобы прикрепить его туда, куда вы перенаправляете на ), и больше нет никакой информации о том, где он «должен был быть».

1
18.03.2021, 23:00

В первые дни моего знакомства с Unix мне объяснили, что труба работает точно так же, как водопровод.

Процесс в основном имеет 3 точки соединения для вашего наполнения:

           stdin
             |
          +--+--+
          | pgm |
          ++---++
           |   |
      stdout   stderr

Таким образом, когда вы выполняете cat | grep pattern, вы получаете

         stdin
           |
        +--+--+
        | cat |
        ++---++
   stdout|   |stderr
         |   \
    stdin|    \
     +------+  |
     | grep |  |
     +-+---++  |
 stdout|   |   |
       |   \__ |
       |      \|
       |       |stderr

(в те времена все было ascii -графика...)

Когда вы перенаправляете stderr на stdout, как в pgm 2>&1, изображение становится:

    stdin |
          |
       +--+--+
       | pgm |
       ++---++
  stdout|   |stderr
        |   /
        |  /
        | /
        |/
        |

Теоретически, таким образом можно сделать много сантехнических работ. Например,:awk '{print;print > "/dev/stderr"}'копирует стандартный ввод как в стандартный вывод, так и в стандартный вывод.

Однако это быстро становится очень запутанным. Подробности смотрите в руководстве по bash.

ПРИМЕЧАНИЕ:pgm = программа на приведенных выше диаграммах.

РЕДАКТИРОВАТЬ :Ради интереса я попробовал немного более сложную сантехнику, используя простые сценарии оболочки.

generate.sh:

echoerr() { echo "$@" 1>&2; }
for i in 1 2 3 4 5 6 ; do
        echo "STDOUT $i"
        echoerr "STDERR $i"
done

иcopytee.sh:

#!/bin/bash
echoerr() { echo "$@" 1>&2; }
while read line; do
        echo "stdout $line"
        echoerr "stderr $line"
done

(обратите внимание, что копируемое объявление в нижнем регистре -и генерирует добавление в верхнем регистре)

Чтобы перейти к расширенным формам перенаправления, bash generate.sh 2> >(bash copytee.sh ) дает в качестве вывода:

STDOUT 1
STDOUT 2
STDOUT 3
STDOUT 4
STDOUT 5
STDOUT 6
stdout STDERR 1
stderr STDERR 1
stdout STDERR 2
stderr STDERR 2
stdout STDERR 3
stderr STDERR 3
stdout STDERR 4
stderr STDERR 4
stdout STDERR 5
stderr STDERR 5
stdout STDERR 6
stderr STDERR 6

именно то, что вы просили.

8
18.03.2021, 23:00

Теги

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