Quais são as diferenças entre “sh file.sh” e “source file.sh”?

1

Estou tentando configurar um cron job para executar testes de regressão para software que geralmente é executado em um ambiente interativo (CASA, para os curiosos mórbidos: link ). Eu tenho um script de shell, que, no formulário MWE ( mwe.sh ), faz:

casapy -c mwe.py

onde é suposto executar esse script. casapy é um negócio bastante complicado que faz muitas coisas internamente, incluindo a importação e a configuração de um cliente ipython para multiprocessamento.

Aqui está o meu problema: Se eu executar o código interativamente, ou seja, digite casapy -c mwe.py na linha de comando do shell bash, ele funciona. Se eu correr:

source mwe.sh

o código ainda é executado exatamente como esperado e executa os testes. Ótimo!

Se, em vez disso, eu correr

bash mwe.sh

o script de inicialização é interrompido permanentemente. Eu rastreei isso em alguns locais diferentes no script de inicialização que todos são capazes de falhar de forma independente.

Então, minha pergunta: Quais são as diferenças entre os comandos iniciais no ambiente de shell interativo e de dentro de um script? Especialmente, quais são as diferenças que podem ser reduzidas a diferenças entre source file.sh e sh file.sh ?

Em particular, no contexto da tarefa do cron que estou tentando executar, existe alguma maneira de fazer o equivalente a source ing de um arquivo na linha de comando interativa?

EDIT: uma última informação - acho que essa falha só acontece no mac, não no linux, mas não sei se isso fornece alguma informação útil porque o código subjacente é um pouco diferente para as duas plataformas.

    
por keflavich 24.02.2015 / 13:35

2 respostas

1

source foo.sh executa o script em o shell Bash atual , muito semelhante a substituindo o comando source foo.sh pelo conteúdo do arquivo foo.sh . sh foo.sh executa o script dentro do contexto de um novo sh shell , que em muitos sistemas operacionais não é nem mesmo Bash (que pode ser uma das razões pelas quais o script não funciona).

    
por 24.02.2015 / 14:00
1

As diferenças entre os comandos iniciais no ambiente do shell interativo ou de dentro de um script são o ambiente.

Para ver as diferenças entre source foo.sh e sh foo.sh , você precisa saber o que acontece de qualquer forma:

  1. source foo.sh :

source é um comando interno somente bash. Isso significa que quando você chama source , não há nenhum executável como /bin/source ou mais. bash analisa a interface da linha de comando para os chamados comandos internos do shell . O comando source é uma função interna de bash to ...

read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.

Então, é como quando você copia e cola linha por linha do seu arquivo foo.sh e pressiona Enter depois de cada linha. Quando não há bash em execução, também não há comando source .

  1. sh foo.sh :

Isso chama o shell /bin/sh padrão com um argumento, um command_file . Esse é um nome de caminho de um arquivo contendo comandos. Esse arquivo não precisa ser executável. E também não há necessidade de uma linha hashbang . Assim, um shell new é iniciado ( /bin/sh ) e nesse novo shell, o comando no arquivo é executado linha por linha. Mas, agora, o ambiente não é o ambiente atual do shell . É o ambiente gerado pelo shell.

    
por 24.02.2015 / 14:30

Tags