Ruim Substituir como forçar / bin / bash como um shell?

3

Eu tenho um script que está sendo executado por um ambiente de terceiros que está executando o script com "/ bin / sh".

Existe uma maneira de, dentro do script, forçar o bash a ser usado, por exemplo, agrupando os comandos em bash <<EOF ... EOF , assim?

#!/bin/bash

bash <<EOF
IMPORTS=$(find /home/snowch -type f -name .project)

for item in ${IMPORTS[*]};
do
   IMPORT="$(dirname $item)/"
   echo $IMPORT
done
EOF
    
por Chris Snow 11.02.2014 / 21:50

2 respostas

3

Você pode usar essa sintaxe que não exige que o $ seja ignorado, ao contrário da tentativa do documento aqui.

#!/bin/bash

bash -c '
IMPORTS=$(find /tmp/foo -type f -name .project)

for item in ${IMPORTS[*]};
do
   IMPORT="$(dirname $item)/"
   echo $IMPORT
done
'

Aqui está uma maneira mais robusta (graças ao comentário sugerido por Gilles), que tem a vantagem de permitir que aspas simples estejam presentes no script incorporado:

#!/bin/bash

bash <<"%EOF%"
IMPORTS=$(find /tmp/foo -type f -name .project)

for item in ${IMPORTS[*]};
do
   IMPORT="$(dirname $item)/"
   echo $IMPORT
done
%EOF%

Nota: não há como impedir que alguém use um shell diferente daquele especificado com o shebang. Escrever um script portátil (ou seja, POSIX) não garante que funcionará com /bin/sh em todas as plataformas, pois o padrão não exige que o shell POSIX use esse caminho.

    
por 11.02.2014 / 22:12
3

Você pode verificar de dentro do script se bash está sendo usado. Caso contrário, substitua o shell atual por bash . Se isso falhar, aborte o script.

[ -z $BASH ] && { exec bash "$0" "$@" || exit; }

Isso garante que o script só possa ser executado usando bash . (Você pode querer substituir o caminho completo para bash no comando acima).

Observe que, conforme apontado por @Gilles e conforme observado no comentário a seguir, essa deve ser a primeira linha no script.

    
por 11.02.2014 / 22:21

Tags