Como posso chamar outro script de shell como uma sub-rotina?

5

Como faço para chamar outro script de shell e aguardar sua conclusão?

Eu quero passar argumentos de entrada e receber o código de retorno do resultado. E continue executando o restante dos códigos.

    
por Eonil 25.06.2011 / 16:17

3 respostas

12

Você não diz qual shell está usando, então, assumindo o bash, você acabou de fazer

#!/bin/bash

/path/to/other/script arg1 arg2
rc=$?

A variável rc agora contém o código de retorno do outro script. Dependendo do que você está tentando alcançar, você pode tentar fazer mais coisas, mas sua pergunta é tão vaga que é o melhor ponto de partida.

    
por 25.06.2011 / 16:19
3

Dependendo do que você está tentando fazer, existem duas possibilidades principais:

  • Você pode chamar o outro script como chamaria qualquer outro programa.

    /path/to/other/script foo bar
    echo "The script exited with status $?"
    
  • Você pode "fornecer" o outro script, ou seja, fazer com que o shell em execução o leia e execute seu conteúdo. Desta forma, o script chamado (as atribuições de variáveis, as alterações do diretório atual, etc.) modifica o ambiente de seu chamador. O built-in para fonte de outro script é chamado . (apenas um ponto); alguns shells têm source como outro nome para . . Você não pode passar argumentos dessa maneira (bem, você pode em algumas conchas, mas não em todas); mas o script chamado tem acesso a todas as variáveis do chamador.

    . /path/to/other/script
    

De qualquer forma, se você omitir o caminho para o outro script, ele será pesquisado em $PATH . Algumas shells automaticamente também procuram no diretório atual, mas outras não (o comportamento padrão não é).

    
por 25.06.2011 / 17:14
0

Ainda existe outra maneira de fazer isso.

Se você usar o verdadeiro Korn Shell (não tenho certeza sobre o pdksh), você pode ter funções carregadas dinamicamente.

Crie um arquivo chamado "main" em algum lugar no PATH:

#!/bin/ksh
echo "Main ksh script"
echo "Calling georgi, probably in another file"
georgi $1 $2 $3
echo "Back from georgi"
franco $1 $2 $3

Crie um arquivo chamado "georgi" em outro lugar, digamos /tmp :

function georgi {
        echo "Enter function georgi $1 $2 $3"
}

function franco {
        echo "Enter function franco $1 $2 $3"
}

Crie o arquivo executável principal. Tornar o arquivo "georgi" não execuable. Exportar uma variável chamada FPATH:

export FPATH=/tmp

Execute o arquivo "main":

% ./main aaa bbb c123 
Main ksh script
Calling georgi, probably in another file
Enter function georgi aaa bbb c123
Back from georgi
Enter function franco aaa bbb c123

Isso é meio obscuro, e você precisa fazer as coisas exatamente corretas, como nomear o arquivo carregado automaticamente da mesma forma que a primeira função que chama, e não ter o arquivo carregado automaticamente marcado se estiver em PATH e FPATH.

    
por 25.06.2011 / 17:57