问题描述
问题核心:
当我无法安装该软件时出现了问题,所以我真诚地询问 ./因为我不知道它,并且输出“找不到命令”让我对命令的实际内容感到困惑。
语境:
我想安装文件 truecrypt-7.2-setup-x86
。
说明说使用该命令:
sudo ./truecrypt-7.2-setup-x86
但输出是:
sudo: ./truecrypt-7.2-setup-x86: command not found
更新:为了完整性,在测试中我在文件夹中但尚未使文件可执行(chmod +x)。
最佳方案
./
不是命令。命令是 ./truecrypt-7.2-setup-x86
。
当命令包含至少一个 /
字符时,您的 shell 和 sudo
等程序会将命令视为 pathname。由于 .
代表您当前所在的任何目录,因此 ./truecrypt-7.2-setup-x86
将当前目录中的文件命名为 truecrypt-7.2-setup-x86
。如果没有这样的文件,或者有但该文件无法运行,那么您将收到错误消息。
当命令不包含斜杠时,将在 $PATH
中列出的目录中搜索它,如 Sergiy Kolodyazhnyy says 。不会自动搜索当前目录——并且不建议将 .
放入 $PATH
中。这样,您就不会意外地运行您不希望运行的内容,因为您碰巧将 cd
d 放入包含它们的目录中。
在当前目录 the common way 中的可执行文件名称前写入 ./
来运行它,但这实际上并不是特殊语法。例如,如果您弄乱了 $PATH
并且需要运行类似 ls
的命令,则可以编写 /bin/ls
。在这种情况下或一般情况下,不需要 .
;需要的是路径名中某处的 /
来表示您的意思是它是路径名。
由于 .
始终是当前目录,而 /
只是目录分隔符,因此要做的第一件事是检查您命名的文件是否确实存在于当前目录中。 (如果存在,则检查其 permissions ,作为 Charles Green explains 。但是,如果您从存档中提取文件,那么如果打算运行它,它通常已经具有可执行权限。)
次佳方案
命令的 ./部分表示“查看当前目录,并从此处执行命令 ‘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
第三种方案
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
请注意, ./
的使用不是随机行为,而是实际上是一个标准,由 Portable Operating System Interface standard ( 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 手册,”COMMAND EXECUTION” 部分:
\\n
If the name is neither a shell function nor a builtin, and contains no slashes, bash searches each element of the PATH for a directory containing an executable file by that name.
\\n
来自 Why do you need ./ (dot-slash) before script name to run it in bash? :
\\n
It works with ./ because POSIX specifies that a command name that contain a / will be used as a filename directly, suppressing a search in $PATH. You could have used full path for the exact same effect, but ./ is shorter and easier to write.
\\n