Núcleo de la pregunta:
La pregunta surgió cuando no pude instalar el software, por lo que realmente estoy preguntando acerca de ./ porque no lo sabía y el resultado "comando no encontrado" me estaba confundiendo acerca de lo que realmente era el comando.
Contexto:
Me gustaría instalar el archivo truecrypt-7.2-setup-x86
.
Las instrucciones dicen que use el comando:
sudo ./truecrypt-7.2-setup-x86
Pero el resultado es:
sudo: ./truecrypt-7.2-setup-x86: command not found
ACTUALIZACIÓN: para completar, en la prueba estaba en la carpeta de archivos pero aún no había hecho el archivo ejecutable (chmod + x).
./
parte del comando dice "Buscar en el directorio actual y ejecutar el comando 'truecrypt-7.2-setup-x86' desde aquí". Debe ejecutar este comando desde el directorio donde descomprimió el archivo.chmod +x
,chmod -x
es todo lo contrario: elimina los permisos ejecutablesRespuestas:
./
No es un comando. El comando es./truecrypt-7.2-setup-x86
.Su shell y programas como
sudo
tratarán un comando como un nombre de ruta cuando contenga al menos un/
carácter. Como.
representa el directorio en el que se encuentra actualmente,./truecrypt-7.2-setup-x86
nombra el archivotruecrypt-7.2-setup-x86
en el directorio actual. Si no existe dicho archivo, o si existe pero el archivo no se puede ejecutar, recibirá un mensaje de error.Cuando un comando no contiene una barra oblicua,
$PATH
se busca en los directorios enumerados , como dice Sergiy Kolodyazhnyy . El directorio actual no es automáticamente buscó - y se no se recomienda poner.
en$PATH
. De esa manera, no ejecuta accidentalmente cosas que no esperaba ejecutar porque resultó que teníacd
un directorio d que las contiene.Escribir
./
antes del nombre de un ejecutable en el directorio actual la forma común de ejecutarlo, pero esta no es realmente una sintaxis especial. Por ejemplo, si cometió un error$PATH
y necesita ejecutar un comando comols
, podría escribir/bin/ls
. No.
es necesario en ese caso o en general; lo que se necesita es un/
lugar en el nombre de ruta para indicar que quiere decir que es un nombre de ruta.Como
.
siempre es el directorio actual y/
es solo el separador de directorios, lo primero que debe hacer es verificar que el archivo que ha nombrado realmente exista en el directorio actual. (Si lo hace, verifique sus permisos , como explica Charles Green . Pero si extrajo el archivo de un archivo comprimido, generalmente ya tendrá permisos ejecutables si está destinado a ejecutarse).fuente
La parte ./ del comando dice "Busque en el directorio actual y ejecute el comando 'truecrypt-7.2-setup-x86' desde aquí". Debe ejecutar este comando desde el directorio donde descomprimió el archivo.
Esto se puede probar: en la misma ventana de terminal donde está probando el comando, ingrese el comando
ls -l true*
; si el archivo está presente en el directorio de trabajo actual, se mostrará una lista que muestra el archivo (y un montón de información adicional).Como Zanna ha señalado en los comentarios, es posible que su archivo no tenga permisos de ejecución; esto se puede solucionar fácilmente. Como caso de prueba, mi directorio muestra
y el archivo "rFullBack" enumera '-rw-' como mi permiso para leer y escribir el archivo. Puedo ejecutar el comando
chmod +x rFullBack
y la lista de directorios cambia aAllí mis permisos ahora son '-rwx', lo que indica que puedo ejecutar el archivo.
En resumen, si el archivo existe en su directorio
ejecuta el comando
y luego el comando
fuente
rw-
como su permiso, el-
antes es para establecer [gu] id y bits fijos.¿Cómo funcionan los comandos de llamada en shell?
No, no es un comando. La forma en que funcionan los shells es cuando escribe una línea de texto, la primera palabra se tratará como comando, y si el comando no es uno de los shell incorporados, el shell buscará en todas las ubicaciones enumeradas en
PATH
la variable de entorno .¿Qué sucede si el comando que desea ejecutar está en el mismo directorio en el que se encuentra actualmente pero ese directorio no está en la lista de
PATH
directorios? Ahí es cuando necesitas usar./
. Es exactamente lo mismo que hacer/bin/bash
: le está diciendo al shell dónde se encuentra su comando deseado, una ruta completa hacia él. Y en el caso de ./ usted está diciendo que "busque en este directorio". Tan importante es que debe estar en el mismo directorio donde se encuentra el archivo.Por supuesto, para ejecutar realmente un ejecutable, debe tener un conjunto de bits ejecutable, por lo que deberá hacerlo
chmod +x ./my_file
.Entonces los pasos importantes:
cd
donde guardó el archivo; si está adentro~/Downloads
, entoncescd ~/Downloads
chmod +x ./truecrypt-7.2-setup-x86
, esto dice "hacer ejecutable el archivo truecrypt-7.2-setup-x86 que está en este directorio"sudo ./truecrypt-7.2-setup-x86
Tenga en cuenta que el uso de
./
no es un comportamiento aleatorio, pero en realidad es un estándar, especificado por el estándar de la interfaz del sistema operativo portátil (también conocido como POSIX) , consulte específicamente la sección "Búsqueda y ejecución de comandos".Reproduciendo el error
NOTA : el mensaje de error dado por
sudo
es obviamente engañoso, por lo que es algo a tener en cuenta; sin embargo, tenga en cuenta que este no era el núcleo de la pregunta que OP está haciendo.Documentación y referencias.
Del
bash
manual 4.3, sección "EJECUCIÓN DE MANDO":De ¿Por qué necesita ./ (punto-raya vertical) antes del nombre de secuencia de comandos para ejecutarlo en bash? :
fuente
sudo
producción es engañosa. Si intenta lo mismo sinsudo
, obtendrá otro error debash
:Permission denied
. Y con razón, ya que no le ha dado permiso al script para ejecutar (víachmod +x
).sudo
salida es engañosa es cierto, pero ese es el error que aparece. Eso podría ser algo para informar a los desarrolladores y dejar que lo arreglen. Sin embargo, este no es el núcleo de la discusión: necesitábamos establecer qué ha hecho OP para producir dicho error y guiarlos hacia el camino correcto. Si es o no engañoso, ese no es el problema aquí./bin/bash
: no le permite ejecutar un script en el que no tiene permiso de ejecución. Cuando introduce el nombre del script/bin/bash
, el hecho de que/bin/bash
sea ejecutable es lo único que importa, ya que es el comando que se ejecuta. Cuando no hace eso, el script en sí se está ejecutando, lo que a su vez conduce a#!
que se invoque su shell actual o lo que sea que esté en la línea superior/bin/bash
es simplemente un ejemplo aquí. El hecho de que estamos llamando/bin/bash
y./script.sh
especificando la ruta a la cosa que se está ejecutando , es lo mismo. Prefacioar script conbash script.sh
o/bin/bash script.sh
es un tema completamente diferente, donde ejecuta un ejecutable y le pasa un script como argumento, que por cierto puede romperse si la sintaxis se escribe para algo diferente al shell que está llamando, por ejemplocsh
./bin/bash
es ejecutable bien, pero el hecho es que todavía está especificando la ruta completa a él./bin/bash
o incluso simplementebash
es también una forma común de resolver la falta de permisos ejecutables en el script. Especificar la ruta completa del script no resuelve ese problema. Entonces,/bin/bash
es un ejemplo particularmente malo en este caso específico.