Se não houvesse stderr, você não veria o erro.
Aqui, o erro é sobre não ser possível abrir o arquivo /dev/stderr , que no Linux é um link simbólico para o arquivo que está aberto no fd 2 (enquanto em outros sistemas, abrir / dev / stderr é como fazer um dup(2) ).
O problema aqui é provável que o fd 2 esteja aberto em um soquete (inet TCP, fluxo Unix ou outro) e você não pode open() um arquivo de soquete.
Se você executar:
sudo lsof -aU +E -d 2
Em um sistema que usa systemd , você notará que o fd 2 da maioria dos serviços é um soquete de fluxo de domínio unix para systemd-journald .
Como solução, você pode começar como:
bash -o pipefail -c '{ /opt/mav/LTE/sakis3g connect -g --sudo 2>&1 >&3 3>&- | cat >&2 3>&-; } 3>&1'
Isso faz stderr um pipe (para cat ) ao invés de um socket, cat encaminhando o que ele recebe no pipe para o stderr original (o socket), e certifica-se que nós preservamos o status de saída do comando com a opção pipefail .
Em qualquer caso, a origem desse sakis3g está disponível e que sakis3g init O arquivo é um script bash que acontece:
echo text >> /dev/stderr
em vez de:
echo test >&2
Até tem alguns > /dev/stderr em vez de >> /dev/stderr , o que é ainda mais errado. Não tem tee -a /dev/stderr | other cmd , o que teria sido um uso legítimo de /dev/stderr e também não funcionaria com stderr em um soquete, então é facilmente corrigível.
Você pode avisá-los sobre o problema levantando um problema no link