Execute o script no shell atual sem. antes do comando

26

Se um script deve ser executado no shell atual, isso pode ser alcançado adicionando um ponto antes do comando:

   . ./somescript.sh

Existe uma maneira de fazer isso sem digitar o ponto toda vez? Por exemplo, um comando para mudar para o shell pai a partir do próprio script?

alu
fonte

Respostas:

22

Pode não ser exatamente o que você deseja, mas você pode fazer:

alias somescript.sh='. ./somescript.sh'
Scott
fonte
2
Isso resolveu meu problema perfeitamente. Obrigado!
alu
8

Existe uma maneira de fazer isso sem digitar o ponto toda vez? Por exemplo, um comando para mudar para o shell pai a partir do próprio script?

Eu não acho que exista (além de digitar source somescript.sh, mas provavelmente não é isso que você está procurando ^^).

Se você executar o script normalmente ./somescript.sh, o shell bifurca e executa esse comando. Ele passa o comando para o kernel e então o kernel decide como esse comando deve ser executado analisando a #!linha dentro do script. O kernel então inicia o intérprete especificado (neste caso provavelmente um bashsubshell). Portanto, as modificações somescript.shfeitas em seu ambiente são isoladas no subshell sem afetar o shell pai.

Se você deseja que o shell leia o próprio script sem iniciar outro processo, é necessário explicitamente dizer usando a palavra-chave .ou source.

Martin von Wittich
fonte
Obrigado pela explicação detalhada. :) Agora vejo que não há como fazer isso a partir do script chamado, mas, felizmente, o shell pai pode ser instruído a não criar um subshell com o aliascomando, como sugeriu scott.
Alu 28/11
1

Se você executa ./somescript.shcomo um programa externo, ele não pode fazer nada dentro do processo do shell em execução, como acessar variáveis ​​não exportadas, definir variáveis, alterar o diretório atual etc. Não há como contornar isso.

(Bem, ok, você pode executar um depurador a partir do subprocesso e ajustar a memória do processo pai. Mas se você tentar, o resultado mais provável é travar o shell pai.)

Você precisa correr . ./somescript.sh. Você pode ocultar isso atrás de um alias ou função, se quiser, mas, novamente, o alias ou a definição de função devem ser feitos no shell pai.

Gilles 'SO- parar de ser mau'
fonte
0

Acho que o script que você está tentando executar não é executável. chmod a+x somescript.shadicionará o bit de execução para usuário, grupo e outros (ugo) a esse arquivo. A primeira linha do arquivo também precisará do #! linha no topo, como #!/bin/bash.

ls -l somescript.shmostrará os trigêmeos rwx (leitura / gravação / execução) para o arquivo. Ele precisará de um x pelo menos no primeiro conjunto, supondo que você seja o proprietário do arquivo.

AR Diederich
fonte
Os scripts em si funcionam bem, mas quero executá-lo no shell atual para poder modificar variáveis ​​de ambiente do shell.
alu
Se a exportação da variável que você deseja no script não estiver funcionando, como export PATH=$PATH:/usr/local/binadicionar / usr / local / bin ao seu $ PATH, será necessário originar o arquivo para alterar as variáveis ​​de ambiente em execução. Esta pergunta é realmente "Como altero programaticamente minhas variáveis ​​de ambiente no meu shell em execução a partir de um script bash?" O script . ./somescript.shestá sendo executado corretamente - você está usando o comando dot para originar um arquivo. O tcsh usa "fonte" para a mesma coisa.
ARDiederich
Modificar uma variável foi apenas um exemplo. A minha pergunta é se é possível dizer a shell deve haver um ponto sem realmente escrevê-lo (por exemplo, do próprio script)
alu
O ponto pode ser facilmente esquecido, o que pode mudar completamente o comportamento do script.
alu
0
export PATH=$PATH:.

Executar esse comando no shell ou adicioná-lo ao seu arquivo de configuração do shell anexará o diretório atual à variável PATH. A variável PATH é uma lista de diretórios em que seu shell procurará binários para executar quando você emitir um comando.

Isso permitirá que você execute qualquer executável no diretório atual sem ./

GabeDain
fonte
11
O OP está perguntando sobre o primeiro, .não o ./que faz parte do nome do arquivo. A execução de ./somescript não o executa no shell atual como o . ./somescriptfaz.
Anthon