¿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
- Ejecutar
chmod +x ./truecrypt-7.2-setup-x86
, esto dice "hacer ejecutable el archivo truecrypt-7.2-setup-x86 que está en este directorio"
- Y ahora hazlo
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
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
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":
Si el nombre no es una función de shell ni una función integrada, y no contiene barras, bash busca en cada elemento de la RUTA un directorio que contenga un archivo ejecutable con ese nombre.
De ¿Por qué necesita ./ (punto-raya vertical) antes del nombre de secuencia de comandos para ejecutarlo en bash? :
Funciona con ./ porque POSIX especifica que un nombre de comando que contiene un / se usará directamente como nombre de archivo, suprimiendo una búsqueda en $ PATH. Podría haber utilizado la ruta completa para el mismo efecto exacto, pero ./ es más corto y más fácil de escribir.
./
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.