Qual é a diferença entre '$. foo 'e' $ ./foo '? [duplicado]

15

t é um script simples O que é diferente entre dois casos abaixo:

$ .  t

e

$ ./t
    
por Bahram Barazandeh 19.02.2015 / 10:14

4 respostas

13

. t não abrirá um novo shell para executar t, então todas as variáveis criadas ou modificadas permanecerão após a execução. t será procurado em $ PATH, então se você quisesse executar t a partir do caminho onde você está agora o comando deveria ter sido . ./t

./t executará t que está no caminho onde estamos agora gerando um shell para execução.

Para esclarecer um pouco mais. Supose t contém:

#!/bin/bash 
data=hello 

Depois de você executar ./t , você pode echo $data da linha de comando e não obterá nada, mas se você executar . ./t e executar echo $data , receberá um oi em seu tela.

    
por 19.02.2015 / 10:27
5

$ . somescript.sh neste caso, o . é um sinônimo do source incorporado. Ele lê o argumento ( somescript.sh no meu exemplo, t no seu) como se você tivesse digitado esses comandos em seu shell atual.

$ ./somescript.sh está executando o script somescript.sh em seu próprio shell. Nesse caso, o . é usado como a parte relativa do caminho para um executável. Para executar um arquivo no Bash no Linux e no Unix (e no Windows, se você instalou o Bash), é necessário fornecer o caminho completo para o executável. Usar ./ como o início do caminho diz ao Bash para usar seu diretório atual.

No segundo caso, é assim que você executa qualquer executável a partir do Bash. No primeiro caso, o arquivo deve ser um arquivo Bash.

    
por 19.02.2015 / 15:50
0

O outro efeito notável da execução de um script no mesmo shell é que o comando exit sairia do seu próprio shell. É comum que os scripts verifiquem variáveis env ou existam arquivos, por exemplo:

if [ -z $JAVA_HOME ]; then
        echo "JAVA_HOME variable is not set. Exit..."
        exit 1
fi

Se você source deste script, você não será capaz de ver o erro (no caso de você não ter o conjunto JAVA_HOME). Seu terminal encerrará ou finalizará a sessão ssh ou você voltará ao usuário previuos se tiver su , etc.

Por isso, é bom executar scripts em um subshell por padrão, em vez de fornecê-los.

    
por 19.02.2015 / 23:07
-2

O ponto . significa o diretório atual, portanto, se t for um script simples em /home/someuser , então .t dará como resultado /home/someusert e gerará um erro porque não existirá.

A barra / dará o caminho correto para o script, então ./t dará como resultado /home/someuser/t , que é o caminho correto para o script

    
por 19.02.2015 / 10:24