问题核心:
当我无法安装该软件时出现了这个问题,所以我确实在询问./,因为我对此并不了解,并且输出“未找到命令”让我对命令的实际含义感到困惑。
语境:
我想安装该文件truecrypt-7.2-setup-x86
。
说明说使用以下命令:
sudo ./truecrypt-7.2-setup-x86
但输出是:
sudo: ./truecrypt-7.2-setup-x86: command not found
更新:为了完整性,在测试中我在文件夹中但尚未使文件可执行(chmod +x)。
答案1
./
不是命令。命令是./truecrypt-7.2-setup-x86
。
你的 shell 和类似的程序sudo
会将命令视为路径名当它至少包含一个/
字符时。由于.
代表您当前所在的目录,因此./truecrypt-7.2-setup-x86
命名当前目录中的文件truecrypt-7.2-setup-x86
。如果没有这样的文件,或者有但无法运行该文件,那么您将收到一条错误消息。
当命令不包含斜杠时,$PATH
被搜索,因为Sergiy Kolodyazhnyy 说当前目录不会被自动搜索——并且不是建议放入.
。这样,您就不会因为碰巧进入了包含它们的目录$PATH
而意外运行您不希望运行的东西。cd
./
在当前目录中的可执行文件名称前写入常见的方式来运行它,但这实际上不是一种特殊的语法。例如,如果你弄乱了你的$PATH
,而你需要运行一个像 这样的命令ls
,你可以写/bin/ls
。.
在这种情况下或一般情况下不需要;需要的是/
路径名中的某个地方来表示它是一个路径名。
由于.
始终是当前目录,并且/
只是目录分隔符,因此要做的第一件事是检查您命名的文件是否确实存在于当前目录中。(如果存在,则检查其权限, 作为查尔斯·格林解释道。但如果你从档案中提取文件,那么它通常如果要运行的话就已经具有可执行权限了。)
答案2
该命令的 ./ 部分表示“查看当前目录,并从此处执行命令‘truecrypt-7.2-setup-x86’”。您需要从解压文件的目录中运行此命令。
这可以进行测试:在尝试该命令的同一终端窗口中,输入该命令ls -l true*
- 如果该文件存在于当前工作目录中,那么将显示一个显示该文件(和一堆附加信息)的列表。
正如 Zanna 在评论中指出的那样,您的文件可能没有执行权限 - 这可以轻松修复。作为测试用例,我的目录显示
chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
文件“rFullBack”将“-rw-”列为我的权限,用于读取和写入文件。我可以执行该命令chmod +x rFullBack
,目录列表将更改为
chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
我的权限现在是“-rwx”,表明我可以执行该文件。
简而言之,如果文件存在于您的目录中
运行命令
chmod +x ./truecrypt-7.2-setup-x86
然后命令
sudo ./truecrypt-7.2-setup-x86
答案3
shell 中如何调用命令
不,它不是命令。shell 的工作方式是,当您输入一行文本时,第一个单词将被视为命令,如果该命令不是 shell 内置命令之一,则 shell 将查看PATH
环境变量中列出的所有位置。
如果您要运行的命令与您当前所在的目录位于同一目录中,但该目录不在目录列表中,会发生什么情况PATH
? 这时您需要使用./
。 它在某种程度上与执行完全相同/bin/bash
- 您告诉 shell 您想要的命令位于何处,以及它的完整路径。 如果是 ./,您告诉 shell“在此目录中查找”。 重要的是您必须位于文件所在的同一目录中。
当然,为了真正运行可执行文件,它必须设置可执行位,因此您需要chmod +x ./my_file
。
因此重要的步骤是:
cd
你保存的地方文件;如果它在~/Downloads
,那么cd ~/Downloads
- 运行
chmod +x ./truecrypt-7.2-setup-x86
,它说“制作文件 truecrypt-7.2-setup-x86这目录可执行文件” - 现在做
sudo ./truecrypt-7.2-setup-x86
请注意,使用./
不是随机行为,而实际上是一种标准,由以下指定:可移植操作系统接口标准(又名 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 中的搜索。您可以使用完整路径来获得完全相同的效果,但 ./ 更短且更容易编写。