Você pode dar alguns detalhes: qual sistema operacional e qual shell (s) ou você está apenas falando sobre esse problema em princípio? Um código de exemplo também seria útil.
jsalonen
14
Esta não é realmente uma pergunta específica nem demonstra um esforço prévio para resolver o problema.
Kris
1
Um problema que eu estava tendo era que b.shnão tinha permissões executáveis. Pode ser uma boa coisa para verificar.
seth10
Anexar ./antes do nome do script, por exemplo: em vez disso b.sh, use:./b.sh
Existem algumas maneiras diferentes de fazer isso:
Torne o outro script executável, adicione a #!/bin/bashlinha na parte superior e o caminho em que o arquivo está para a variável de ambiente $ PATH. Então você pode chamá-lo como um comando normal;
Ou chame-o com o sourcecomando (alias is .) assim source /path/to/script:;
Ou use o bashcomando para executá-lo: /bin/bash /path/to/script;
Os primeiro e terceiro métodos executam o script como outro processo, portanto, variáveis e funções no outro script não estarão acessíveis.
O segundo método executa o script no processo do primeiro script e extrai variáveis e funções do outro script para que possam ser utilizadas no script de chamada.
No segundo método, se você estiver usando exitno segundo script, ele sairá do primeiro script também. O que não acontecerá no primeiro e no terceiro método.
lembre-se, chmod a+x /path/to/fileou então não será executável. Aplica-se apenas ao método ./script.
Nathan Lilienthal
3
Lembre-se de formato de mudança / codificação de arquivos executáveis em UNIX se eles são criados em DOS e, em seguida, enviado para o ambiente UNIX -> dos2unix <nome do script>
Abhishek Chatterjee
3
@cecemel A primeira e a terceira maneira podem ser "assíncronas" usando a sintaxe normal de execução em segundo plano.
Algum programador cara
16
O problema sourceé que uma exitdeclaração no script chamado também sairá da sua ...
Ohad Schneider
18
@ user528025 .não é um alias para source, mas o contrário. sourceé uma extensão bash, enquanto .trabalha em qualquer shell compatível com POSIX.
Score_Under
207
Veja isso.
#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
Isso pressupõe que script.sh esteja no mesmo diretório que o script que está sendo executado. Se você quisesse chamar um script para outro lugar, você diriash <path to script>/script.sh
Morgan Kenyon
32
Isso também usa duas conchas bashe sh. Mesmo quando shé de fato bash, não se comporta da mesma maneira. Se você estiver usando #!/bin/bash, provavelmente desejará usar bash script.sh(ou apenas ./script.shusar o hashbang desse script).
Martin Tournoij 14/11
1
Mantive o erro de permissão negada, mesmo quando defino o chmod +xarquivo .sh. Alguma sugestão?
Isaac weathers
@isaacweathers try chmod 777
Janac Meena
114
Existem algumas maneiras de fazer isso. Terminal para executar o script:
#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"# Here you execute your script"$SCRIPT_PATH"# or."$SCRIPT_PATH"# or
source "$SCRIPT_PATH"# or
bash "$SCRIPT_PATH"# oreval'"$SCRIPT_PATH"'# or
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT
# or
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT
# or("$SCRIPT_PATH")# or(exec "$SCRIPT_PATH")
Tudo isso está correto para o caminho com espaços !!!
Quais são as diferenças deles? Por que um, por que outro?
rocketspacer
. "$ SCRIPT_PATH" é o preferido
Harry Mumford-Turner
1
Posso apenas acrescentar que nem todos são equivalentes, por exemplo, sh "$ SCRIPT_PATH" e bash "$ SCRIPT_PATH" não executam o script #! / Usr / bin / expect, enquanto apenas "$ SCRIPT_PATH" o executará.
Tahlor 23/01/19
58
A resposta que eu estava procurando:
( exec "path/to/script")
Como mencionado, execsubstitui o shell sem criar um novo processo. No entanto , podemos colocá-lo em um subshell, o que é feito usando os parênteses.
EDIT: Na verdade, ( "path/to/script" )é suficiente.
Depende de. Resumidamente ... Se você deseja carregar variáveis no console atual e executar, você pode usar source myshellfile.shno seu código. Exemplo:
!#/bin/bash
set-x
echo "This is an example of run another INTO this session."
source my_lib_of_variables_and_functions.sh
echo "The function internal_function() is defined into my lib."
returned_value=internal_function()
echo $this_is_an_internal_variable
set+x
Se você deseja apenas executar um arquivo e a única coisa interessante para você é o resultado, você pode:
!#/bin/bash
set-x
./executing_only.sh
sh i_can_execute_this_way_too.sh
bash or_this_way.sh
set+x
Certamente isso será executado showdate.shem / bin / sh em vez de / bin / bash?
Chris Watts
Eu tentei com " /bin/sh ./showdate.sh", " /bin/bash ./showdate.sh", " ./showdate.sh" e execute o arquivo: mainscript.sh e obtive a mesma saída.
Ranjithkumar T
10
Basta adicionar em uma linha o que você digitou em um terminal para executar o script!
por exemplo:
#!bin/bash./myscript.sh &
se o script a ser executado não estiver no mesmo diretório, use o caminho completo do script.
por exemplo: `/ home / user / diretório-script /./ myscript.sh &
Se você tiver outro arquivo no mesmo diretório, poderá:
bash another_script.sh
ou
source another_script.sh
ou
. another_script.sh
Quando você usa, em bashvez de source, o script não pode alterar o ambiente do script pai. O .comando é o padrão POSIX, enquanto o sourcecomando é um sinônimo de bash mais legível para .(eu prefiro sourcesobre .). Se o seu script residir em outro lugar, forneça o caminho para esse script. O caminho relativo e o caminho completo devem funcionar.
A resposta superior sugere adicionar #!/bin/bashlinha à primeira linha do sub-script que está sendo chamado. Mas mesmo se você adicionar o shebang, é muito mais rápido * executar um script em um sub-shell e capturar a saída:
$(source SCRIPT_NAME)
Isso funciona quando você deseja continuar executando o mesmo intérprete (por exemplo, do bash para outro script do bash) e garante que a linha shebang do sub-script não seja executada.
Por exemplo:
#!/bin/bash
SUB_SCRIPT=$(mktemp)
echo "#!/bin/bash"> $SUB_SCRIPT
echo 'echo $1'>> $SUB_SCRIPT
chmod +x $SUB_SCRIPT
if[[ $1 =="--source"]];thenfor X in $(seq 100);do
MODE=$(source $SUB_SCRIPT "source on")doneelsefor X in $(seq 100);do
MODE=$($SUB_SCRIPT "source off")donefi
echo $MODE
rm $SUB_SCRIPT
Resultado:
~❯❯❯ time ./test.sh
source off
./test.sh 0.15s user 0.16s system 87% cpu 0.360 total
~❯❯❯ time ./test.sh --source
source on
./test.sh --source 0.05s user 0.06s system 95% cpu 0.114 total
* Por exemplo, quando ferramentas de vírus ou segurança estão sendo executadas em um dispositivo, pode levar mais 100ms para executar um novo processo.
#!/bin/bash# Here you define the absolute path of your script
scriptPath="/home/user/pathScript/"# Name of your script
scriptName="myscript.sh"# Here you execute your script
$scriptPath/$scriptName
# Result of script execution
result=$?
Essa era a única coisa que eu precisava. Depois que o script a ser executado for executável dessa maneira, você (pelo menos no meu caso) não precisará de nenhuma outra operação extra, como shou./ enquanto estiver chamando o script.
Existem alguns problemas para importar funções de outro arquivo. Primeiro : você não precisa executar este arquivo. Melhor não fazer isso! basta adicionar
. file
para importar todas as funções. E todos eles serão como se estivessem definidos no seu arquivo. Segundo : você pode definir a função com o mesmo nome. Será substituído. É mau. Você pode declarar assim
declare -f new_function_name=old_function_name
e somente depois disso importamos. Portanto, você pode chamar a função antiga pelo novo nome. Terceiro : você pode importar apenas a lista completa de funções definidas no arquivo. Se alguns não forem necessários, você pode desmarcá-los. Mas se você reescrever suas funções após a desativação, elas serão perdidas. Mas se você definir a referência conforme descrito acima, poderá restaurar após a definição com o mesmo nome. FinalmenteNo procedimento comum de importação é perigoso e não é tão simples. Seja cuidadoso! Você pode escrever um script para fazer isso mais fácil e seguro. Se você usar apenas parte das funções (não todas), é melhor dividi-las em arquivos diferentes. Infelizmente, essa técnica não se saiu bem no bash. No python, por exemplo, e em outras linguagens de script, é fácil e seguro. É possível fazer importação parcial apenas das funções necessárias com seus próprios nomes. Todos nós queremos que nas próximas versões do mato seja feita a mesma funcionalidade. Mas agora precisamos escrever muitos bacalhaus adicionais para fazer o que quiser.
(Bem-vindo ao SO!) Como o usuário Praveen foi visto pela última vez em 2011, é difícil determinar se a questão era como fazer o shell executar a.sh executar b.sh (e continuar executando a.sh, se não ordenou o contrário ), ou literalmente b.sh chamada . (Meu verificador ortográfico não pega bush versions.) (Você tem alguém a quem recorrer para ajudá-lo com a gramática inglesa? (Às vezes gostaria que eu tivesse.)) #
b.sh
não tinha permissões executáveis. Pode ser uma boa coisa para verificar../
antes do nome do script, por exemplo: em vez dissob.sh
, use:./b.sh
No such file or directory
erro stackoverflow.com/a/2920431/1356559Respostas:
Existem algumas maneiras diferentes de fazer isso:
Torne o outro script executável, adicione a
#!/bin/bash
linha na parte superior e o caminho em que o arquivo está para a variável de ambiente $ PATH. Então você pode chamá-lo como um comando normal;Ou chame-o com o
source
comando (alias is.
) assimsource /path/to/script
:;Ou use o
bash
comando para executá-lo:/bin/bash /path/to/script
;Os primeiro e terceiro métodos executam o script como outro processo, portanto, variáveis e funções no outro script não estarão acessíveis.
O segundo método executa o script no processo do primeiro script e extrai variáveis e funções do outro script para que possam ser utilizadas no script de chamada.
No segundo método, se você estiver usando
exit
no segundo script, ele sairá do primeiro script também. O que não acontecerá no primeiro e no terceiro método.fonte
chmod a+x /path/to/file
ou então não será executável. Aplica-se apenas ao método ./script.source
é que umaexit
declaração no script chamado também sairá da sua ....
não é um alias parasource
, mas o contrário.source
é uma extensão bash, enquanto.
trabalha em qualquer shell compatível com POSIX.Veja isso.
fonte
sh <path to script>/script.sh
bash
esh
. Mesmo quandosh
é de fatobash
, não se comporta da mesma maneira. Se você estiver usando#!/bin/bash
, provavelmente desejará usarbash script.sh
(ou apenas./script.sh
usar o hashbang desse script).chmod +x
arquivo .sh. Alguma sugestão?Existem algumas maneiras de fazer isso. Terminal para executar o script:
Tudo isso está correto para o caminho com espaços !!!
fonte
A resposta que eu estava procurando:
Como mencionado,
exec
substitui o shell sem criar um novo processo. No entanto , podemos colocá-lo em um subshell, o que é feito usando os parênteses.EDIT: Na verdade,
( "path/to/script" )
é suficiente.fonte
/path/to/script
? Eu não vejo a necessidade deexec
tudo aqui?exec
usando.Depende de. Resumidamente ... Se você deseja carregar variáveis no console atual e executar, você pode usar
source myshellfile.sh
no seu código. Exemplo:Se você deseja apenas executar um arquivo e a única coisa interessante para você é o resultado, você pode:
Espero que ajude você. Obrigado.
fonte
source
é um recurso específico do bash. A casca de bourne padrão possui apenas.
(por exemplo. other_script.sh
).Você pode usar
/bin/sh
para chamar ou executar outro script (via seu script real):A saída seria:
fonte
showdate.sh
em / bin / sh em vez de / bin / bash?/bin/sh ./showdate.sh
", "/bin/bash ./showdate.sh
", "./showdate.sh
" e execute o arquivo: mainscript.sh e obtive a mesma saída.Basta adicionar em uma linha o que você digitou em um terminal para executar o script!
por exemplo:
se o script a ser executado não estiver no mesmo diretório, use o caminho completo do script.
por exemplo: `/ home / user / diretório-script /./ myscript.sh &
fonte
&
for background task #Primeiro você precisa incluir o arquivo que você chama:
então você chama sua função assim:
fonte
Fonte simples irá ajudá-lo. Para Ex.
fonte
Se você tiver outro arquivo no mesmo diretório, poderá:
ou
ou
Quando você usa, em
bash
vez desource
, o script não pode alterar o ambiente do script pai. O.
comando é o padrão POSIX, enquanto osource
comando é um sinônimo de bash mais legível para.
(eu prefirosource
sobre.
). Se o seu script residir em outro lugar, forneça o caminho para esse script. O caminho relativo e o caminho completo devem funcionar.fonte
A resposta superior sugere adicionar
#!/bin/bash
linha à primeira linha do sub-script que está sendo chamado. Mas mesmo se você adicionar o shebang, é muito mais rápido * executar um script em um sub-shell e capturar a saída:$(source SCRIPT_NAME)
Isso funciona quando você deseja continuar executando o mesmo intérprete (por exemplo, do bash para outro script do bash) e garante que a linha shebang do sub-script não seja executada.
Por exemplo:
Resultado:
* Por exemplo, quando ferramentas de vírus ou segurança estão sendo executadas em um dispositivo, pode levar mais 100ms para executar um novo processo.
fonte
fonte
fonte
scriptPath
ou nome de arquivoscriptName
com espaçosSuponha que o novo arquivo seja "/ home / satya / app / app_specific_env" e o conteúdo do arquivo seja o seguinte
Anexe esta referência de arquivo ao arquivo ~ / .bashrc
Sempre que você reiniciar a máquina ou conectar-se novamente, tente
echo $FAV_NUMBER
no terminal. Isso produzirá o valor.Apenas no caso, se você quiser ver o efeito imediatamente,
source ~/.bashrc
na linha de comando.fonte
Essa era a única coisa que eu precisava. Depois que o script a ser executado for executável dessa maneira, você (pelo menos no meu caso) não precisará de nenhuma outra operação extra, como
sh
ou./
enquanto estiver chamando o script.Graças ao comentário de @Nathan Lilienthal
fonte
Existem alguns problemas para importar funções de outro arquivo.
Primeiro : você não precisa executar este arquivo. Melhor não fazer isso! basta adicionar
para importar todas as funções. E todos eles serão como se estivessem definidos no seu arquivo.
Segundo : você pode definir a função com o mesmo nome. Será substituído. É mau. Você pode declarar assim
e somente depois disso importamos. Portanto, você pode chamar a função antiga pelo novo nome.
Terceiro : você pode importar apenas a lista completa de funções definidas no arquivo. Se alguns não forem necessários, você pode desmarcá-los. Mas se você reescrever suas funções após a desativação, elas serão perdidas. Mas se você definir a referência conforme descrito acima, poderá restaurar após a definição com o mesmo nome.
FinalmenteNo procedimento comum de importação é perigoso e não é tão simples. Seja cuidadoso! Você pode escrever um script para fazer isso mais fácil e seguro. Se você usar apenas parte das funções (não todas), é melhor dividi-las em arquivos diferentes. Infelizmente, essa técnica não se saiu bem no bash. No python, por exemplo, e em outras linguagens de script, é fácil e seguro. É possível fazer importação parcial apenas das funções necessárias com seus próprios nomes. Todos nós queremos que nas próximas versões do mato seja feita a mesma funcionalidade. Mas agora precisamos escrever muitos bacalhaus adicionais para fazer o que quiser.
fonte
bush versions
.) (Você tem alguém a quem recorrer para ajudá-lo com a gramática inglesa? (Às vezes gostaria que eu tivesse.)) #Use retalhos.
Em seguida, busque a saída do script produtor como um argumento no script consumidor.
fonte