Diferença entre “./” e “. ”Para executar um script / aplicativo? [duplicado]

3

Eu sempre executei scripts usando ./

Por exemplo, ./script.sh

Recentemente aprendi que você também pode digitar . script.sh

Existe alguma diferença?

O segundo é muito mais fácil para mim já que meu teclado não tem uma chave para / mas eu preciso pressionar SHIFT - .

    
por user985366 14.08.2015 / 23:31

2 respostas

6

Quando você executa ./script.sh , o script é executado em um subshell. Portanto, qualquer operação / alteração que o script deva fazer é realizada no subshell, portanto, o shell pai, ou seja, a partir do shell do qual o script foi chamado, não é afetado pelas alterações.

Por outro lado, quando você faz . script.sh ( . é o mesmo que shell builtin source ), o script é source significando que todos os comandos são executados nesta instância de shell (da qual ele é chamado ). Portanto, qualquer alteração nos atributos, como variáveis, declaração de funções afeta o shell.

Normalmente, source é usado para arquivos de configuração do usuário. ~/.bashrc depois de fazer qualquer modificação, por exemplo adicionando um novo caminho para PATH , para que a alteração seja aplicada a partir da sessão atual do shell.

Talvez um exemplo torne você mais claro:

$ cat script.sh  ##Our test script, containing just a variable (spam) declaration 
#!/bin/bash
spam=foobar

$ ./script.sh  ## Execute using ./script.sh

$ echo "$spam"  ## Prints nothing


$ . script.sh  ## Lets source it

$ echo "$spam"  ## Now we get it
foobar
    
por heemayl 14.08.2015 / 23:39
1

Ambos executam o script que está localizado no mesmo diretório em que você está, ou seja, seu diretório de trabalho atual.

Fazer . script é referido como origem do script em bash

De link

  

Quando um arquivo é originado (digitando o nome do arquivo de origem ou o nome do arquivo.   na linha de comando), as linhas de código no arquivo são executadas como se   eles foram impressos na linha de comando. Isso é particularmente útil   com prompts complexos, para permitir que eles sejam armazenados em arquivos e chamados   através do fornecimento do arquivo em que estão.

     

Nos exemplos, você vai perceber que muitas vezes eu incluo #! / bin / bash no   início de arquivos incluindo funções. Isso não é necessário se você   estão obtendo um arquivo, assim como não é necessário chmod + x um arquivo   que vai ser originado. Eu faço isso porque faz o Vim (meu editor   de escolha, sem chamas, por favor - você usa o que você gosta) acho que estou editando   um script de shell e ative o realce da sintaxe de cor.

Há um ponto a ser observado: o script é executado como se fosse digitado na linha de comando , o que significa que espera a sintaxe bash . Portanto, se você atualmente está trabalhando em bash e deseja executar um script escrito em tcsh style, o bash irá reclamar. Por outro lado, se você usar . bashstylescript.sh , isso funcionará.

Aqui está uma demonstração disso. cwhile.sh está em tcsh style e whileloop.sh está em bash style.

 serg@ubuntu [/home/xieerqi]
================================
$ . cwhile.sh
bash: cwhile.sh: line 8: syntax error: unexpected end of file
 serg@ubuntu [/home/xieerqi]
================================
$ . whileloop.sh 
    28206 
    33672 
    18406 
    65344 
    12022 
    10751 
    29707 
    44303 
    15081 
    59236 

Que tal ./script ? Nesse caso, o shell lerá #! line e executará o shell apropriado para executar seu script.

 serg@ubuntu [/home/xieerqi]
================================
$ ./cwhile.sh 
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times

Como você pode ver, o shell lê minha linha #!/bin/tcsh e permite que tcsh execute o script.

Anotação lateral : Fazer . script.sh em outros shells pode não funcionar, já que parece ser apenas uma coisa bash. mksh , por exemplo, não faz isso, mas usa source script.sh way

    
por Sergiy Kolodyazhnyy 14.08.2015 / 23:46

Tags