Остерегайтесь ответа Юджина (не могу прокомментировать его ответ), чуть выше, что синтаксис для обмена SDTOUT и STDERR действует в Unix (Unixen-подобных оболочках, таких как ksh или bash, я думаю), но не под Windows CMD (ошибка: 3>& was unexpected at this time.
).
Подходящий синтаксис в Windows CMD и Perl в Windows:
perl -e "$r=qx{nslookup 255.255.255.255 2>&1 1>&3 3>&2};
Обратите внимание, что команда:
nslookup 255.255.255.255
будет производить (что-то вроде) на STDOUT:
Server: mymodem.lan
Address: fd37:c01e:a880::1
и на STDERR:
*** mymodem.lan can't find 255.255.255.255: Non-existent domain
Вы можете проверить, что этот синтаксис работает со следующим синтаксисом CMD / Perl:
Первый:
perl -e "$r=qx{nslookup 255.255.255.255 2>&1 1>&3 3>&2}; $r=~s/[\n\r]//eg; print qq{on STDOUT qx result=[$r]};"
вы получите: Server: mymodem.lan
Address: fd37:c01e:a880::1
on STDOUT qx result=[*** mymodem.lan can't find 255.255.255.255: Non-existent domain]
Тогда
perl -e "$r=qx{nslookup 255.255.255.255 2>&1 1>&3 3>&2}; $r=~s/[\n\r]//eg; print STDOUT qq{on STDOUT qx result=[$r]};" 2>&1 1>NUL:
вы получите: Server: mymodem.lan
Address: fd37:c01e:a880::1
QED [fr: CQFD]
Обратите внимание, что невозможно получить ОБА stderr и stdout в качестве возвращаемой строки для команды qx или backticks. Если вы точно знаете, что текст ошибки, возвращаемый вашей порожденной командой, имеет длину N строк, вы все равно можете перенаправить STDERR в STDOUT, как описано Евгением и другими, но записать ваш возвращенный текст qx в массив, а не в виде скалярной строки. Поток STDERR будет возвращен в массив до STDOUT, так что N первых строк вашего массива будут строками SDTERR. Как:
@r=qx{nslookup 255.255.255.255 2>&1};
$r[0] is "*** mymodem.lan can't find 255.255.255.255: Non-existent domain"
Но, конечно, вы должны быть уверены, что - это текст ошибки в STDERR и строго N строк (хранится в @r[0..N-1]
). Если нет, то единственным решением является использование временных файлов, как описано выше.