Como executar um script de shell dentro de um script de shell

4

Estou usando o bash no Mac OSX.

Eu tenho um arquivo de shell chamado myshell.sh e o uso para fazer muitas coisas.

Eu tenho um arquivo entry.sh que contém:

# content of entrance.sh
./myshell.sh arg1 arg2
./myshell.sh arg3 arg4

Mas quando executo entrance.sh , recebo um erro:

./entrance.sh: line 2: myshell.sh: command not found

Eu posso rodar o myshell.sh diretamente.

O que posso fazer?

    
por AGamePlayer 10.02.2015 / 13:02

3 respostas

6

./myshell.sh significa que o script myshell.sh é encontrado no diretório atual . Se você executar esse script de algum outro lugar, não funcionará. Você poderia usar caminhos completos, mas, nesse caso, as únicas soluções sensatas são:

  1. Adicionando a localização de myshell.sh ao seu $PATH (no caso, myshell.sh é realmente algo que deve ser chamado de qualquer lugar). Então, adicione PATH="$PATH":/dir/of/myshell no início do script externo.

  2. Coloque myshell.sh em algum lugar para que seja acessível de qualquer lugar (assim como todos os outros executáveis no sistema). Isso seria /usr/local/bin mais provável. Use isso somente se esse script for universalmente útil.

Se os scripts dependem de arquivos locais em seu diretório (e podem até quebrar e causar danos se chamados de outro lugar), você deve deixá-lo no formulário atual (isso na verdade impede que você os chame de lugares onde você está não deveria), ou use cd dentro do script para chegar ao local apropriado. Tenha cuidado, use caminhos absolutos em scripts de shell para cd , é muito fácil quebrar coisas se algo der errado e você sair .. e cd -em mais falhar, você pode escapar do diretório e reinar caos em todos os diretórios pais.

Principalmente, eu recomendaria a solução nº 1.

    
por 10.02.2015 / 15:36
2

Como sugerido pelo YoMismo, você deve usar o caminho completo em seu script ou cd no diretório de scripts.

# content of entrance.sh
/full/path/myshell.sh arg1 arg2
/full/path2/myshell.sh arg3 arg4

Ou (mas esta é uma solução muito feia)

# content of entrance.sh
cd /full/path
./myshell.sh arg1 arg2
cd /full/path2
./myshell.sh arg3 arg4
    
por 10.02.2015 / 13:09
0

Meu palpite é que ./myshell.sh não tem permissões de execução (precisa executar 'chmod + x myshell.sh'), ou não está no diretório atual (preciso movê-lo para o mesmo diretório que a entrada. sh).

Tente chamar ./myshell no mesmo diretório que ./entrance.sh, você obtém o mesmo resultado?

Além disso, se quiser ter mais certeza de que você executa seu script, você pode ligar diretamente para ele:

/bin/bash ./myshell arg1 arg2
    
por 10.02.2015 / 15:49

Tags