Eu gostaria de me conectar a diferentes shells (csh, ksh etc.) e executar comandos dentro de cada shell comutado.
A seguir está o programa de amostra que reflete minha intenção:
#!/bin/bash
echo $SHELL
csh
echo $SHELL
exit
ksh
echo $SHELL
exit
Desde então, eu não sou bem versado com scripts Shell precisa de um ponteiro sobre como conseguir isso. Qualquer ajuda seria muito apreciada.
Respostas:
3 para resposta № 1Se você quiser executar apenas um único comando, poderá usar o -c
opção
csh -c "echo $SHELL"
ksh -c "echo $SHELL"
Se você quiser executar vários comandos, ou até mesmo um script inteiro em um shell filho, você pode usar o recurso here-document do bash e usar o comando -s
(leia os comandos de stdin
) nas conchas infantis:
#!/bin/bash
echo "this is bash"
csh -s <<- EOF
echo "here go the commands for csh"
echo "and another one..."
EOF
echo "this is bash again"
ksh -s <<- EOF
echo "and now, we"re in ksh"
EOF
Note que você não pode verificar facilmente o shell em que está echo $SHELL
porque o shell pai expande esta variável ao texto /././bash
. Se você quiser ter certeza de que o shell filho funciona, verifique se uma sintaxe específica do shell está funcionando ou não.
1 para resposta № 2
É possível usar as opções de linha de comando fornecidas por cada shell para executar um trecho de código.
Por exemplo, para bash
use o -c
opção:
bash -c $code
bash -c "echo hello"
zsh
e fish
também use o -c
opção.
Outros shells indicarão as opções que eles usam em suas páginas de manual.
1 para resposta № 3
Você precisa usar o -c
opção de linha de comando se você quiser passar comandos na inicialização do bash:
#!/bin/bash
# We are in bash already ...
echo $SHELL
csh -c "echo $SHELL"
ksh -c "echo $SHELL"
1 para resposta № 4
Você pode passar scripts complexos arbitrários para um shell, usando o -c
opção, como em
sh -c "echo This is the Bourne shell."
Você vai economizar muitas dores de cabeça relacionadas a cotações e expansão de variáveis se você encerrar a chamada em uma função lendo o script em stdin Como:
execute_with_ksh()
{
local script
script=$(cat)
ksh -c "${script}"
}
prepare_complicated_script()
{
# Write shell script on stdout,
# for instance by cat-ting a here-document.
cat <<"EOF"
echo ${SHELL}
EOF
}
prepare_complicated_script | execute_with_ksh
A vantagem deste método é que é fácil inserir um tee no pipe ou quebrar o pipe para controlar o script sendo passado para o shell.
Se você quiser executar o script em um host remoto por meio ssh você deve considerar codificar seu script na base 64 para transmiti-lo com segurança ao shell remoto.