./(点斜线)是命令吗?

ubu*_*ubu 16 command-line sudo paths executable software-installation

问题的核心:

当我无法安装软件时出现了问题,所以我真正地询问 ./ 因为我不知道它并且输出“未找到命令”让我对命令的实际内容感到困惑。

语境:

我想安装文件truecrypt-7.2-setup-x86

说明说使用命令:

sudo ./truecrypt-7.2-setup-x86
Run Code Online (Sandbox Code Playgroud)

但输出是:

sudo: ./truecrypt-7.2-setup-x86: command not found
Run Code Online (Sandbox Code Playgroud)

更新:为了完整起见,在测试中我在文件夹中,但尚未使文件可执行(chmod + x)。

Eli*_*gan 24

./不是命令。命令是./truecrypt-7.2-setup-x86.

sudo一个命令至少包含一个字符时,您的 shell 和类似程序会将其视为路径名/。由于.代表您当前所在的任何目录,因此./truecrypt-7.2-setup-x86命名truecrypt-7.2-setup-x86当前目录中的文件。如果没有这样的文件,或者有但该文件无法运行,那么您将收到错误消息。

当命令不包含斜杠时,$PATH会搜索其中列出的目录,正如Sergiy Kolodyazhnyy 所说。当前目录是不会自动搜索-并且它建议把.$PATH。这样,您就不会意外地运行您不希望运行的东西,因为您碰巧将cdd 放在包含它们的目录中。

./在当前目录中的可执行文件的名称之前写入是运行它的常用方法,但这实际上并不是一种特殊的语法。例如,如果您搞砸了,$PATH并且需要运行类似 的命令ls,则可以编写/bin/ls. 没有.在这种情况下,或者在一般的必要; 需要的是/路径名中的某个位置来表示您的意思是它是一个路径名。

由于.始终是当前目录并且/只是目录分隔符,因此首先要做的是检查您命名的文件是否确实存在于当前目录中。(如果是,则检查其权限,正如Charles Green 解释的那样。但是如果您从存档中提取文件,那么如果打算运行它,它通常已经具有可执行权限。)


Cha*_*een 21

命令的 ./ 部分是说“查看当前目录,并从这里执行命令 '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$
Run Code Online (Sandbox Code Playgroud)

并且文件“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$
Run Code Online (Sandbox Code Playgroud)

我的权限现在是“-rwx”,表示我可以执行该文件。


简而言之,如果该文件存在于您的目录中

运行命令

chmod +x ./truecrypt-7.2-setup-x86
Run Code Online (Sandbox Code Playgroud)

然后命令

sudo ./truecrypt-7.2-setup-x86
Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 8

在 shell 中调用命令是如何工作的

不,这不是命令。shell 的工作方式是,当您输入一行文本时,第一个单词将被视为命令,如果该命令不是 shell 内置命令之一,则 shell 将查看PATH 环境变量中列出的所有位置.

如果您要运行的命令与您当前所在的目录位于同一目录中,但该目录不在PATH目录列表中,会发生什么情况?这时候就需要使用./. 它在某种程度上与所做的完全相同/bin/bash- 您正在告诉 shell 您想要的命令所在的位置,它的完整路径。在 ./ 的情况下,您是在说 shell“查看此目录”。如此重要的部分是您必须位于文件所在的同一目录中。

当然,为了实际运行可执行文件,它必须设置可执行位,因此您需要chmod +x ./my_file.

所以重要的步骤:

  1. cd 您保存文件的位置;如果它在~/Downloads,那么cd ~/Downloads
  2. 运行chmod +x ./truecrypt-7.2-setup-x86,这表示“使目录中的文件 truecrypt-7.2-setup-x86可执行”
  3. 现在做 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
Run Code Online (Sandbox Code Playgroud)

注意:由 给出的错误消息sudo显然具有误导性,因此需要牢记这一点;但是请注意,这不是OP 提出的问题的核心。

文档和参考

bash4.3 手册,“命令执行”部分:

如果名称既不是 shell 函数也不是内置函数,并且不包含斜杠,则 bash 会在 PATH 的每个元素中搜索包含该名称的可执行文件的目录。

为什么在脚本名称之前需要 ./ (dot-slash) 才能在 bash 中运行它?

它与 ./ 一起使用,因为POSIX 指定包含 / 的命令名称将直接用作文件名,从而禁止在 $PATH 中进行搜索。您可以使用完整路径来实现完全相同的效果,但 ./ 更短且更易于编写。

  • @SergiyKolodyazhnyy 用`/bin/bash` 甚至只是`bash` 作为脚本名称的开头_也是_解决脚本缺乏可执行权限的常用方法。指定完整的脚本路径_不会_解决该问题。所以`/bin/bash` 在这种特殊情况下是一个特别糟糕的例子。 (2认同)