¿Cuál es la diferencia entre ejecutar un ejecutable solo por nombre y agregar un punto / barra diagonal antes?

13

Este es el resultado del ls -allcomando:

-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 ./jdevqué es así?

Friki
fuente

Respuestas:

20

Cuando ejecuta un archivo ejecutable (o más bien en unix / linux world, un archivo con derechos ejecutables / indicador activado) así:

$ ./jdev

luego marca con .que desea ejecutar un archivo dentro de su directorio de trabajo (directorio en el que se encuentra actualmente) que tiene nombre jdevy tiene derechos ejecutables para el usuario que lo está iniciando (debe tener en cuenta que aún puede ser un enlace a otro archivo, puede verificar eso escribiendo ls -l jdevel terminal)

(ver permisos de archivo en linux / unix )

Cuando lo ejecutas como

$ jdev

entonces lo más probable es que haya jdevinstalado en algún lugar del sistema y lo tienes en $PATH(por ejemplo, /usr/bin/o /bin/o /usr/local/bin/)

Como dijo Peter : puede usar whichpara apuntar el ejecutable que se inicia con un comando en particular, por ejemplo:

$ which find
/usr/bin/find
Patryk
fuente
1
Tampoco es que la whichutilidad pueda decirle qué ejecutable se usará si no se proporciona ninguna ruta.
Peter
@peterph editó mi respuesta.
Patryk
77
Es mucho mejor usar typepara verificar lo que se inicia mediante un comando en particular. Causa whichle mostrará solo un binario en algún lugar de $ PATH, sin embargo, puede ser alias a absolutamente otro binario.
prisa el
@rush yo sólo ha tratado de eso y no de trabajo a medida que decir: [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim. Mientraszsoelim -> soelim
Patryk
2
@Patryk Creo que rush significaba los alias / funciones de shell, que whichno 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).
Peter
8

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 $PATHvariable 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 zshpermitir que los alias o las funciones tengan barras en su nombre que luego prevalecerían).

Entonces, si desea ejecutar un comando llamado fooque está en el directorio de trabajo actual, debe encontrar un nombre que contenga una barra diagonal. ./fooEs lo más obvio. También podría usar la ruta completa, o ../dir/foo...

Para saber qué ejecutaría el shell, use el typecomando No utilice el whichcomando que generalmente no hace lo que cree que hace y es una herencia de la cshque es mejor dejarlo solo.

Stéphane Chazelas
fuente
¿Por qué no "cuál" sino "tipo"?
Geek
@ Geek, es una pregunta frecuente aquí, vea unix.stackexchange.com/search?q=[whichfont>+type
Stéphane Chazelas
¿proporcionó el enlace correcto?
Geek
Ese es un resultado de búsqueda en este sitio para demostrar que es una pregunta frecuente. Muchas respuestas a esas preguntas le dirán por qué no usar which. Ver por ejemplo unix.stackexchange.com/questions/16693/…
Stéphane Chazelas
2

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:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %
Afsin Toparlak
fuente
1

Aunque esto probablemente depende de su shell, la regla generalmente es:

  • Si proporciona una ruta, ya sea relativa o absoluta, se usa esa ruta. ./jdeves una ruta relativa, porque .representa el directorio actual (de hecho, ls -all .le daría lo mismo que ls -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, $PATHse 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 jdevejecutar el ejecutable en el directorio actual. A menos que haya cambiado $PATHpara 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 $PATHsiempre 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 $PATHcomienza con ., un simple ls -lahserá suficiente para atacar su sistema.

njsg
fuente
Tu terminología es confusa. jdevsolo 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)
Stéphane Chazelas