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
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é