[1181656] Обратите внимание, что вам не следует этого делать: [12154] Над оболочкой открывается [1182084]tmp[1182085] для записи на дескриптор 2, затем открывается [1182086]tmp[1182087] для повторной записи на дескриптор 1, а затем выполняется [1182088]ls[1182089]. У вас будет два дескриптора [1182090]ls[1182091], указывающие на два отдельных описания открытых файлов в одном и том же файле.[12155] Если [1182092]ls[1182093] запишет и на свой дескриптор 1 (stdout для списка файлов), и на дескриптор 2 (stderr для сообщений об ошибках), то эти выходы перезапишут друг друга (предполагая, что [1182094]tmp[1182095] является обычным файлом, а не именованной трубкой). [12156]На самом деле вывод stdout будет буферизован, поэтому более вероятно, что он будет записан в конце перед выходом [1182096]ls[1182097], поэтому он перезапишет вывод stderr. [12157]Пример:[12158]Вы должны использовать:[12159]или[12160]В этом случае оболочка открывает [1182098]tmp[1182099] в fd 2, а затем дублирует этот fd на fd 1, так что оба fd 1 и 2 будут иметь одно и то же описание открытого файла на [1182100]tmp[1182101], и выходы не будут перезаписывать друг друга.[12161]
27.01.2020, 23:12
Ссылка