Во многих местах я встречал людей, предлагающих заменить stderr на stdout следующим образом:

Команда 3> & 2 2> & 1 1> & 3

Это смотрит назад на меня. Если мы отправим 3 в 2, а затем сразу же отправим 2 в 1 (что теперь будет выглядеть как отправка 3 и 2 в 1). Я думаю, что есть что-то базовое, чего я не понимаю в перенаправлении ввода-вывода, но я не могу найти ничего, что проясняет это.

1
dspyz 20 Дек 2013 в 02:00

2 ответа

Лучший ответ

Подробное объяснение можно найти на странице http: //www.catonmat .net / blog / bash-one-liners -olated-part-three /, раздел 21:

$ command 3> & 1 1> & 2 2> & 3 Здесь мы сначала дублируем файловый дескриптор 3, чтобы он стал копией stdout. Затем мы дублируем stdout, чтобы он был копией stderr, и, наконец, мы дублируем stderr, чтобы он был копией файлового дескриптора 3, который является stdout. В результате мы поменяли местами stdout и stderr.

Более подробную информацию и изображения можно найти по ссылке. Ключевой вывод:

3>&1 означает «3 точки туда, куда указывает 1». Затем 1>&2 говорит: «теперь 1 указывает туда, куда указывает 2» (1 теперь указывает на поток 2, но 3 не следует ...), и, наконец, 2>&3 говорит: «теперь 2 указывает на то, где 3 указывает (это поток 1).

Графически (но см. Ссылку - намного лучше, чем мой ascii-art):

0 --> /dev/tty0
1 --> /dev/tty1
2 --> /dev/tty2

После 3>&1:

0 --> /dev/tty0
1 --> /dev/tty1
2 --> /dev/tty2
3 --> /dev/tty1

После 1>&2:

0 --> /dev/tty0
1 --> /dev/tty2
2 --> /dev/tty2
3 --> /dev/tty1

После 2>&3:

0 --> /dev/tty0
1 --> /dev/tty2
2 --> /dev/tty1
3 --> /dev/tty1

Как видите, 1 и 2 поменялись местами. По той же ссылке рекомендуется закрыть временный поток 3 с помощью 3>&-

3
Floris 19 Дек 2013 в 22:15

Ха, я никогда такого не видел .... во всяком случае ... кажется, что, по сути, сначала говорится ... отправь 3 на адрес 2 .... затем отправь 2 на адрес 1 .... затем отправьте один на адрес 3 ... который с первого шага, как мы знаем, является исходным адресом двух ... так что вы поменяли их местами ...

1
James Gawron 19 Дек 2013 в 22:07