Оператор <&
дублирует дескриптор «входного» файла.Согласно IEEE Std 1003.1-2001 (так называемая Single Unix Specification v3, преемник POSIX), считается ошибкой говорить 2<&1
, если 1 не является файловым дескриптором, открытым для ввода.Однако, похоже, что bash
ленив и ему все равно, открыт ли дескриптор файла для ввода или вывода.
Так что и 2<&1
, и 2>&1
просто выполняют системный вызов dup2(1, 2)
, который копирует дескриптор файла 1 в дескриптор файла 2.
Вы можете проверить, выполнив команду, подобную этой, поскольку перенаправления выполняются слева направо:
sleep 99999 1>/dev/null 2<&1
Затем в другом окне, запустите lsof
в процессе sleep
.Вы увидите, что оба файловых дескриптора 1 и 2 указывают на /dev/null
.Пример (на моем Mac):
:; ps axww | grep sleep
8871 s001 R+ 0:00.01 grep sleep
8869 s003 S+ 0:00.01 sleep 99999
:; lsof -p 8869 | tail -2
sleep 8869 mayoff 1w CHR 3,2 0t0 316 /dev/null
sleep 8869 mayoff 2w CHR 3,2 0t0 316 /dev/null