Я верю, что вы о чем-то нам не говорите. Вы на Cygwin? Или винда? У вас есть переменная окружения PERL5SHELL
?
Есть что-то, о чем вы нам не говорите, потому что оба они отлично работают на пяти платформах, на которых я могу легко протестировать:
% perl -le '$out = `sh -c "grep missing /dev/nowhere 2>&1" | cat -n`; chomp $out; print "got <<<$out>>>"'
got <<< 1 grep: /dev/nowhere: No such file or directory>>>
Но в действительности нет никаких оснований вызывать sh (1) явно для обстрела. Это потому, что Perl всегда вызывает sh (1) для всех своих обратных тиков, открытия канала и system()
оболочки:
% perl -le '$out = `grep missing /dev/nowhere 2>&1 | cat -n`; chomp $out; print "got <<<$out>>>"'
got <<< 1 grep: /dev/nowhere: No such file or directory>>>
Единственное, кроме этого, что я могу придумать, происходит в не-Unix системах, где, поскольку у них нет / bin / sh , определено что-то еще.
Но ни при каких условиях простые вывески не будут вызывать tcsh (1) за вашей спиной. Вы должны были серьезно взломать источник perl (1), чтобы это произошло. Я также сомневаюсь, что вы могли (легко) взломать двоичный файл, поскольку строка "/bin/tcsh"
будет длиннее "/bin/sh"
, и ее не очень часто можно найти в / bin / в любом случае.
То, что перенаправление stderr не работает даже из оболочки, говорит о том, что происходит что-то довольно странное. Я думаю, что нам нужно больше информации.