Comment se débarrasser de stderr dans un shell Bash restreint?

Dans mon .bashrc il y a quelques commands qui redirigent l'erreur standard vers / dev / null , et ceci n'est pas autorisé dans rbash :

 bash: /dev/null: ressortingcted: cannot redirect output 

Y a-t-il un moyen de contourner ce problème (à less de modifier Bash)? C'est-à-dire

  • écarter l'erreur standard d'une autre manière ou
  • essayez seulement de redirect si c'est autorisé.

Vous pouvez fermer stderr comme dans:

 ls /blah 2>&- 

Bien que cela fonctionne dans la plupart des cas, cela peut causer des problèmes car des applications mal écrites peuvent finir par ouvrir un nouveau file qui obtiendrait automatiquement 2 comme descripteur de file et pourrait finir par écrire des messages d'erreur là où vous ne voudriez pas.

Cela signifie également que toute écriture dans stderr effectuée par l'application returnnerait avec une erreur (EBADF) qui pourrait affecter leur comportement.

Comme les tuyaux sont autorisés, vous pouvez fournir une command qui rejette toutes ses inputs. Ici, en utilisant grep -v '^' (mais vous pouvez utiliser la tail -n 0 ou sed d ou un script appelé discard qui fait cat > /dev/null ):

 { ls /blah 2>&1 >&3 | grep -v '^'; } 3>&1 

Vous pouvez vérifier si la redirection vers /dev/null est autorisée / fonctionne ou non avec:

 if : 2>&- > /dev/null; then echo allowed fi 

Vous pouvez vérifier si le shell est restreint ou non avec:

 case $- in (*r*) echo ressortingcted esac 

De man rbash il semble que toute redirection est interdite: (ce qui suit sont interdits ou non exécutés) redirecting output using the >, >|, <>, >&, &>, and >> redirection operators

Il semble que vous pouvez générer un autre script shell pour effectuer la redirection. When a command that is found to be a shell script is executed, rbash turns off any ressortingctions in the shell spawned to execute the script.

Donc, alors que vous ne pouviez pas $ foo 2>/dev/null il semble que vous pourriez lancer $ bar où la barre contient
#/bin/bash
foo 2>/dev/null

Il devrait être mis en place à l'avance à partir d'un environnement bash complet car rbash interdit également de specifying command names containing / qui semblent interdire votre directory actuel ./bar mais pas implicit /bin/bar

S'il vous plaît noter: je ne l'ai pas encore essayé