Shell中的调用命令如何工作
不,这不是命令。Shell的工作方式是当您输入一行文本时,第一个单词将被视为命令,并且如果该命令不是Shell内置命令之一,则Shell将查看PATH
环境变量中列出的所有位置。
如果要运行的命令与您当前所在的目录位于同一目录但该目录不在PATH
目录列表中,该怎么办?那是您需要使用的时候./
。它与执行操作的方式完全相同/bin/bash
-您正在告诉外壳程序所需命令的位置,以及该命令的完整路径。如果是./,则是说要外壳“在此目录中查找”。重要的一点是,您必须位于文件所在的目录中。
当然,要实际运行可执行文件,必须将可执行位设置为1,因此您需要chmod +x ./my_file
。
所以重要的步骤:
cd
文件的保存位置;如果它在~/Downloads
,然后cd ~/Downloads
- 运行
chmod +x ./truecrypt-7.2-setup-x86
,显示“ 此目录可执行文件中的make文件truecrypt-7.2-setup-x86 ”
- 现在做
sudo ./truecrypt-7.2-setup-x86
请注意,使用./
并不是随机行为,而是实际上是由可移植操作系统接口标准(aka POSIX)指定的标准,具体请参见“命令搜索和执行”部分。
重现错误
$ # 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
注意:给出的错误信息sudo
显然是令人误解的,因此请记住这一点;但是请注意,这不是 OP提出的问题的核心。
文档和参考
从bash
4.3手册的“命令执行”部分:
如果该名称既不是shell函数也不是内置函数,并且不包含任何斜杠,则bash会在PATH的每个元素中搜索包含该名称的可执行文件的目录。
从为什么前脚本名称你需要./(点斜杠)在bash中运行呢?:
它可与./一起使用,因为POSIX指定将包含/的命令名直接用作文件名,从而禁止在$ PATH中进行搜索。您可以使用完整路径来获得完全相同的效果,但是./较短且更易于编写。
./
命令的部分内容为“查看当前目录,然后从此处执行命令'truecrypt-7.2-setup-x86'”。您需要从解压缩文件的目录中运行此命令。