/ / Shell shell de script dentro do shell - linux, bash, shell

Shell shell de script dentro do shell - linux, bash, shell

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 № 1

Se 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 $SHELLporque 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.