У Bash manual есть ясный пример (аналогичный вашему), чтобы показать, что порядок имеет значение, а также объясняет разницу. Вот соответствующая часть взята (курсив мой):
Note that the order of redirections is significant. For example, the command
ls >dirlist 2>&1
directs both standard output (file descriptor 1) and standard error (file descriptor 2) to the file dirlist, while the command
ls 2>&1 >dirlist
directs only the standard output to file dirlist, because the standard error was made a copy of the standard output before the standard output was redirected to dirlist.
This post объясняет это с точки зрения POSIX.
Замедление происходит из-за ключевой разницы. >
redirects не, делая левый операнд (stderr
) указывает на правый операнд (stdout
), но сделав копию правого операнда и назначив его влево.Концептуально, присваивание копией, а не ссылкой.
Поэтому чтение слева направо, который, как это интерпретируется Bash: ls > dirlist 2>&1
средства перенаправления stdout
в файл dirlist
, с последующим перенаправлением stderr
к тому, что stdout
в данный момент указывает на (который уже сам файл). OTOH ls 2>&1 > dirlist
перенаправляет stderr
на то, что stdout
в настоящее время указывает на (который является экраном/терминалом), а затем перенаправляет stdout
на dirlist
.
Stdout НЕ по умолчанию tty. Он просто унаследован от оболочки. Если оболочка является интерактивной и запущена на tty, то stdout и stderr по умолчанию - tty. Если оболочка не запущена на tty, то это не так. Я понимаю, что это похоже на нит, но важно не связывать stdout с терминалом, и люди делают эту ошибку очень часто. –
Да, я имел в виду в контексте интерактивной оболочки, так как OP запускает эту команду в интерактивной оболочке. – anubhava