J'ai un logiciel qui doit /bin/sh
être Bash, mais pour Ubuntu, la valeur par défaut est Dash et je veux la conserver par défaut; Je ne veux pas le changer définitivement en Bash.
Existe-t-il un moyen de le modifier uniquement pour une session de terminal en cours d'exécution? Un programme exécuté dans ce terminal verra donc /bin/sh
lié à bash mais le reste du système verra toujours Dash? Ou puis-je tromper le logiciel pour le voir /bin/sh
comme Bash même si ce n'est pas le cas?
Je n'ai pas écrit ce logiciel et le pirater pour l'utiliser /bin/bash
au lieu de /bin/sh
n'est pas vraiment une option.
command-line
bash
sh
corwin
la source
la source
/bin/sh
estbash
est un bug, et il provoque des problèmes réels (comme vous savoir). Si personne ne se plaint, cela ne changera peut-être jamais.Réponses:
Deux réponses suggèrent déjà de chrooter et de lier des montures, et il y a une troisième option étroitement liée: monter des espaces de noms . En utilisant le
unshare
programme , vous pouvez créer un nouvel espace de noms de montage, et les montages dans cet espace de noms n'affecteront pas les autres espaces de noms.Par exemple, dans un terminal, je fais:
Et dans un autre:
Vous pouvez donc exécuter ce programme inflexible dans son propre espace de noms de montage.
la source
Si c'est un script, appelez simplement le script comme
Pas besoin de changer de liens du tout.
Pour l'exécutable compilé, vous pouvez aller chroot route:
Et puis exécutez votre programme ou
sudo chroot rootfs /yourprogram
Cependant, dans la pratique, il n'y a aucune raison pour laquelle vous ne pouvez pas l'utiliser
/bin/bash
comme lien symbolique vers/bin/sh
. En fait, avant la version 6.10, Ubuntu utilisait/bin/bash
as/bin/sh
, puis ils ont changé en raison d'/bin/sh
une implémentation beaucoup plus rapide et plus légère de POSIX/bin/sh
(c'est-à-dire qu'il respecte la norme POSIX pour la façon dont les utilitaires et les systèmes d'exploitation de type Unix devraient se comporter et implémenter certains de leurs internes), et pour des raisons de portabilité. Je recommande fortement de lire la réponse de Gilles également pour des notes historiques sur la façon dont cela/bin/dash
s'est produit. Quant à la compatibilité, les scripts écrits pourdash
utiliser les fonctionnalités POSIX fonctionneront avecbash
un shell par défaut parfaitement bien. Habituellement, c'est l'inverse qui cause des problèmes -bash
a des fonctionnalités qui ne sont pas requises par/bin/sh
, comme la<<<
syntaxe ou les tableaux.De plus, la commande en question est probablement écrite en gardant à l'esprit RHEL ou CentOS, qui utilise
/bin/bash
un lien symbolique vers/bin/sh
, suggère deux choses: ils ciblaient probablement un système d'exploitation spécifique et n'adhéraient pas aux principes POSIX. Dans ce cas, ce serait également une bonne idée de vérifier les autres éléments requis par la commande, car si elle est vraiment écrite avec un autre système d'exploitation à l'esprit, vous pourriez rencontrer plus de problèmes que la simple reconnexion/bin/sh
.la source
ln
oucp -l
).mount --rbind --make-rslave
plutôt quecp -r
. Peut également être mis en lecture seule. Exécute égalementsudo chroot
le script en tant que root, ce qui peut ne pas être optimal.Une possibilité serait un montage de liaison d'un seul fichier. Pour ce faire, vous montez le fichier un
/bin/bash
peu plus de/bin/dash
sortebash
sorte de couvertures ou de masquesdash
. Voici les étapes (y compris l'inverse):Cependant, je n'ai pas essayé de masquer
mount --bind /bin/bash /bin/sh
directement le lien symbolique. L' astuce ci-dessus rend simplement bash et dash identiques, ce qui fait référence à bien qu'il pointe vers . En outre, il s'agit d'une solution à l'échelle du système, non seulement pour la fenêtre de terminal actuelle.mount
sh
bash
dash
Je dois avouer que cela pourrait être exagéré et simplement changer temporairement le lien symbolique est beaucoup plus facile. Je voulais juste montrer une autre voie possible.
la source
Vous devriez pouvoir le modifier uniquement pour la session en cours en utilisant un alias. Avant d'exécuter votre commande dans le terminal:
Ce sera temporaire et uniquement actif dans le terminal à partir duquel il a été exécuté.
CEPENDANT: cela NE FONCTIONNERA PAS si votre script utilise des chemins absolus.
Malheureusement, le "piratage" du script pourrait être votre seule option. Par convo avec @vanadium, vous pouvez créer un script wrapper comme celui-ci:
Cependant, pendant la durée de votre script, vous feriez mieux d'espérer que rien sur votre système ne nécessite explicitement un tiret.
la source