Este es el resultado del 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
Ahora, cuando lo ejecuto jdev
, ejecuta una versión diferente de Oracle JDveloper que cuando lo ejecuto como ... ¿Por ./jdev
qué es así?
which
utilidad pueda decirle qué ejecutable se usará si no se proporciona ninguna ruta.type
para verificar lo que se inicia mediante un comando en particular. Causawhich
le mostrará solo un binario en algún lugar de $ PATH, sin embargo, puede ser alias a absolutamente otro binario.[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim
. Mientraszsoelim -> soelim
which
no tiene posibilidades de encontrar, ya que es un binario independiente que no tiene acceso al entorno de shell en ejecución (con lo que me refiero a alias y funciones, no solo a las variables de entorno , algunos de los cuales se heredan).Si llama a un comando sin una barra diagonal en su nombre en un shell, se busca en los alias, funciones y en la lista de rutas proporcionadas en la
$PATH
variable de entorno. (tenga en cuenta que puede tener el directorio de trabajo actual (especificado como.
o la cadena vacía) o cualquier directorio relativo$PATH
, pero eso no se recomienda por razones de seguridad).Si hay una barra oblicua en el nombre, entonces eso no sucede, el nombre se toma como una ruta para ejecutar el comando (aunque algunos shells como
zsh
permitir que los alias o las funciones tengan barras en su nombre que luego prevalecerían).Entonces, si desea ejecutar un comando llamado
foo
que está en el directorio de trabajo actual, debe encontrar un nombre que contenga una barra diagonal../foo
Es lo más obvio. También podría usar la ruta completa, o../dir/foo
...Para saber qué ejecutaría el shell, use el
type
comando No utilice elwhich
comando que generalmente no hace lo que cree que hace y es una herencia de lacsh
que es mejor dejarlo solo.fuente
which
. Ver por ejemplo unix.stackexchange.com/questions/16693/…Recomiendo usar el 'where' incorporado de Zsh (mejor que 'which') para ver cómo y en qué orden se encontrarán alias, shell incorporados o cualquier otra cosa para $ PATH ;-)
Aquí hay un ejemplo para entender mejor las cosas, cómo se elige:
fuente
Aunque esto probablemente depende de su shell, la regla generalmente es:
Si proporciona una ruta, ya sea relativa o absoluta, se usa esa ruta.
./jdev
es una ruta relativa, porque.
representa el directorio actual (de hecho,ls -all .
le daría lo mismo quels -all
). Si lo hace/usr/bin/tool/
, está utilizando una ruta absoluta. En estos casos, se ejecuta el archivo señalado.Si no proporciona una ruta, sino solo un nombre,
$PATH
se busca en los directorios la herramienta que está intentando ejecutar.Si tiene un archivo en el directorio actual con el mismo nombre que un archivo en algunos de los directorios
$PATH
, y lo ejecuta al anteponer./
su nombre, efectivamente ejecutará un archivo diferente.Quizás otro problema es que realmente esperaba
jdev
ejecutar el ejecutable en el directorio actual. A menos que haya cambiado$PATH
para incluir.
, esto no es algo que deba esperar en absoluto ...... y todavía no es una buena idea incluir
.
allí, si lo hace, al menos póngalo al final, para que el resto$PATH
siempre se busque primero, solo imagine que está en un directorio de red compartido y alguien decide poner un binario malvado allíls
, ya que , si$PATH
comienza con.
, un simplels -lah
será suficiente para atacar su sistema.fuente
jdev
solo es también un camino relativo. La regla es: si no contiene una barra oblicua, entonces se busca en alias, funciones y$PATH
, de lo contrario, se busca directamente en el sistema de archivos (aunque algunos shells permiten alias o funciones con / en su nombre que luego tomarían precedencia)