Você pode fechar o stderr como em:
ls /blah 2>&-
Embora isso funcione na maioria dos casos, pode causar problemas, pois aplicativos mal escritos podem acabar abrindo um novo arquivo que obteria automaticamente 2
como o descritor de arquivo e poderia acabar escrevendo mensagens de erro onde você não gostaria eles para.
Isso também significa que qualquer gravação no stderr feita pelo aplicativo retornará com um erro (EBADF) que pode afetar seu comportamento.
Como os canais são permitidos, você pode fornecer um comando que descarta todas as suas entradas. Aqui, usando grep -v '^'
(mas você pode usar tail -n 0
ou sed d
ou um script chamado discard
que faz cat > /dev/null
):
{ ls /blah 2>&1 >&3 | grep -v '^'; } 3>&1
Alternativamente, você poderia ter o que inicia esse shell restrito iniciá-lo com o fd 3 (por exemplo) redirecionado para /dev/null
( rbash 3> /dev/null
), então você pode fazer dentro do shell restrito:
ls /blah 2>&3
Qual é permitido:
$ rbash -c 'ls /blah 2>&3' 3> /dev/null
$
Você pode verificar se o redirecionamento para /dev/null
é permitido / funciona ou não com:
if true 2>&- > /dev/null; then
echo allowed
fi
Você pode verificar se o shell está restrito ou não:
case $- in
(*r*) echo restricted
esac