Eu tenho um software que precisa /bin/sh
ser o Bash, mas para o Ubuntu o padrão é Dash e quero mantê-lo como padrão; Não quero alterá-lo para Bash permanentemente.
Existe uma maneira de alterá-lo apenas para uma sessão de terminal em execução? Portanto, um programa em execução neste terminal será /bin/sh
vinculado ao bash, mas o resto do sistema ainda verá o Dash? Ou posso enganar o software para ver /bin/sh
como Bash, mesmo que não seja?
Eu não escrevi este software e cortá-lo para usá-lo em /bin/bash
vez de /bin/sh
não é realmente uma opção.
command-line
bash
sh
corwin
fonte
fonte
/bin/sh
ébash
é um bug, e que provoca problemas reais (como você está encontrando para fora). Se ninguém reclamar, isso nunca será alterado.Respostas:
Duas respostas já sugerem montagens de chrooting e bind, e há uma terceira opção intimamente relacionada: montar namespaces . Usando o
unshare
programa , você pode criar um novo espaço para nome de montagem e montagens nesse espaço para nome não afetarão outros espaços para nome.Por exemplo, em um terminal, eu faço:
E em outro:
Portanto, você pode executar este programa inflexível em seu próprio espaço para nome de montagem.
fonte
Se for um script, basta chamá-lo como
Não há necessidade de alterar os links.
Para executável compilado, você pode seguir a rota chroot:
E então execute seu programa ou
sudo chroot rootfs /yourprogram
No entanto, na prática, não há razão para que você não possa usar
/bin/bash
como link simbólico para/bin/sh
. De fato, antes da versão 6.10, o Ubuntu estava usando/bin/bash
como/bin/sh
e, em seguida, eles mudaram devido a/bin/sh
uma implementação muito mais rápida e mais enxuta do POSIX/bin/sh
(ou seja, segue o padrão POSIX de como os utilitários de sistema operacional e o sistema operacional semelhantes ao Unix devem se comportar e implementar alguns de seus internos) e por motivos de portabilidade. Eu recomendo fortemente a leitura da resposta de Gilles , bem como notas históricas sobre como isso/bin/dash
aconteceu. Quanto à compatibilidade, os scripts escritos paradash
usar os recursos do POSIX serão executadosbash
como um shell padrão perfeitamente adequado. Geralmente, é o contrário que causa problemas -bash
possui recursos que não são necessários/bin/sh
, como<<<
sintaxe ou matrizes.Além disso, o comando em questão provavelmente é escrito com o RHEL ou o CentOS em mente, que usa
/bin/bash
como um link simbólico para/bin/sh
, sugere duas coisas: eles provavelmente foram direcionados ao SO específico e não aderiram aos princípios do POSIX. Nesse caso, também seria uma boa ideia verificar quais outras coisas o comando exige, pois se ele realmente foi escrito com outro sistema operacional em mente, você pode ter mais problemas do que apenas se reconectar/bin/sh
.fonte
ln
oucp -l
).mount --rbind --make-rslave
vez decp -r
. Também pode ser feito somente leitura. Tambémsudo chroot
executa o script como root, o que pode não ser o ideal.Uma possibilidade seria uma montagem de ligação de um único arquivo. Para fazer isso, você monta o arquivo
/bin/bash
apenas sobre/bin/dash
essebash
tipo de capa ou ocultaçãodash
. Aqui estão as etapas (incluindo o inverso):Eu não tentei ocultar
mount --bind /bin/bash /bin/sh
diretamente o link simbólico. O truque acima apenas torna o bash e o dash idênticos, de modo que se refere a embora aponte para . Além disso, esta é uma solução para todo o sistema, não apenas para a janela atual do terminal.mount
sh
bash
dash
Devo confessar que isso pode ser um exagero e simplesmente mudar o link simbólico temporariamente é muito mais fácil. Eu só queria mostrar outra maneira possível.
fonte
Você deve poder alterá-lo apenas para a sessão atual usando um alias. Antes de executar seu comando no terminal:
Isso será temporário e somente ativo no terminal do qual foi executado.
NO ENTANTO: Isso NÃO FUNCIONARÁ se o seu script usar caminhos absolutos.
Infelizmente, "invadir" o script pode ser sua única opção. Por convenção com @vanadium, você pode criar um script de wrapper como este:
No entanto, durante a duração do seu script, é melhor esperar que nada no seu sistema exija explicitamente traço.
fonte