q1
Quando um comando é especificado sem um diretório, o PATH é procurado pelo comando. Se o comando não for encontrado no PATH, uma mensagem de erro será emitida. Isto é para sua segurança e segurança.
Se um comando for especificado com um caminho, o shell assumirá que você sabe o que está fazendo e executa esse comando.
Às vezes, as pessoas colocam o diretório atual no PATH. O PATH é uma lista de diretórios separados por dois pontos. Se um desses diretórios estiver vazio, ele será interpretado como o diretório atual. Por exemplo, neste PATH, o espaço vazio após os últimos dois pontos é interpretado como sendo o diretório atual:
$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:
Com esse PATH, você pode executar um comando no diretório atual sem especificar ./
na frente de seu nome. Esteja ciente, no entanto, de que isso pode levar a uma surpresa desagradável.
q2
Sim, um espaço de ponto principal significa fonte do script. A obtenção de um script significa que ele é executado no shell atual, não em uma subcamada. Um script de origem pode alterar o ambiente atual. Um script em uma subshell não pode. Os dois comandos seguintes são equivalentes:
source ~/.bashrc
. ~/.bashrc
Em resumo, (1) um ponto-espaço inicial na linha de comando significa 'source the script' e (2) um ponto inicial em um nome de arquivo significa que o arquivo está oculto. Esses dois usos do ponto são separados e independentes.
Q1
O primeiro diretório no seu PATH é .
, que é o diretório atual. É por isso que você é capaz de executar scripts no diretório atual sem especificar seu diretório.
Como o diretório atual é especificado primeiro, esse PATH é especialmente perigoso: significa que qualquer script no diretório atual terá precedência sobre todos os executáveis padrão em /bin
, /usr/bin
, etc. Isso pode causar falha de qualquer programa que espera poder executar os executáveis usuais.
Q2
Vamos fazer um teste adicionando um diretório inexistente, chamá-lo de nonsense
, para o PATH:
$ type date
date is hashed (/bin/date)
$ export PATH=/usr/bin/:nonsense:/bin
$ hash -r # delete the cache
$ date
Thu Jul 9 11:13:18 PDT 2015
Caminhos inválidos são ignorados e a pesquisa continua com o próximo elemento na lista PATH.
Q3
Não, os diretórios inválidos no PATH não são interpretados como o diretório atual. Por exemplo:
$ export PATH=/usr/bin/:nonsense
$ date
bash: date: command not found
$ cd /bin
$ date
bash: date: command not found
$ ./date
Thu Jul 9 11:17:34 PDT 2015