Esta é a saída do ls -all
comando:
-rwxr----- 1 subhrcho dba 3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba 1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba 347 Mar 6 2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba 821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba 584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba 4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba 5047 Dec 6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe
Agora, quando apenas executo, jdev
ele executa uma versão diferente do Oracle JDveloper do que quando executo como ./jdev
.. Por que é isso?
which
utilitário possa dizer qual executável será usado se nenhum caminho for fornecido.type
para verificar o que é iniciado por um comando específico. A causawhich
mostrará apenas um binário em algum lugar do $ PATH, no entanto, pode estar alias a absolutamente outro binário.[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim
. Enquantozsoelim -> soelim
which
não têm chance de encontrar, uma vez que é um binário independente que não tem acesso ao ambiente shell em execução (com o que quero dizer apelidos e funções, não apenas as variáveis de ambiente , alguns dos quais são herdados).Se você chamar um comando sem barra em seu nome em um shell, ele será procurado nos aliases, funções e na lista de caminhos fornecidos na
$PATH
variável de ambiente. (observe que você pode ter o diretório de trabalho atual (especificado como.
ou a cadeia vazia) ou qualquer diretório relativo$PATH
, mas isso não é recomendado por razões de segurança).Se houver uma barra no nome, isso não acontecerá, o nome será usado como um caminho para executar o comando (embora alguns shells, como por exemplo,
zsh
permitam que aliases ou funções tenham barras no nome, os quais teriam precedência).Portanto, se você deseja executar um comando chamado
foo
que está no diretório de trabalho atual, é necessário criar um nome que contenha uma barra../foo
é o mais óbvio. Você também pode usar o caminho completo ou../dir/foo
...Para saber o que o shell executaria, use o
type
comando Não use owhich
comando que geralmente não faz o que você pensa que faz e é uma herança dacsh
qual é melhor ficar sozinho.fonte
which
. Veja, por exemplo, unix.stackexchange.com/questions/16693/…Eu recomendo usar o 'where' interno do Zsh (melhor que 'what') para ver como e em qual ordem os aliases, os shell shell ou qualquer outra coisa será encontrada para $ PATH ;-)
Aqui está um exemplo para entender melhor as coisas, como é escolhido:
fonte
Embora isso provavelmente dependa do seu shell, a regra geralmente é:
Se você fornecer um caminho, relativo ou absoluto, esse caminho será usado.
./jdev
é um caminho relativo, porque.
significa o diretório atual (na verdade,ls -all .
daria o mesmo quels -all
). Se fizer isso/usr/bin/tool/
, você está usando um caminho absoluto. Nesses casos, o arquivo apontado é executado.Se você não fornecer um caminho, mas apenas um nome, os diretórios
$PATH
serão pesquisados em busca da ferramenta que você está tentando executar.Se você tiver um arquivo no diretório atual com o mesmo nome de um arquivo em alguns dos diretórios do diretório
$PATH
e o executar acrescentando./
o nome dele, efetivamente executará um arquivo diferente.Talvez outro problema seja que você esperava
jdev
executar o executável no diretório atual. A menos que você tenha alterado$PATH
para incluir.
, isso não é algo que você deve esperar ...... e ainda não é uma boa ideia incluí
.
-la, se você o fizer, pelo menos coloque-o no final, para que o resto$PATH
seja sempre pesquisado primeiro - imagine que você esteja em um diretório de rede compartilhado e alguém decide colocar um binário maligno láls
, pois , se$PATH
começar.
, um simplesls -lah
será suficiente para atacar seu sistema.fonte
jdev
sozinho também é um caminho relativo. A regra é: se não contém uma barra, é pesquisada em aliases, funções e$PATH
, caso contrário, é pesquisada diretamente no sistema de arquivos (embora alguns shells permitam aliases ou funções com / em seu nome, o que seria necessário precedência).