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


16

问题的核心:

当我无法安装软件时出现了问题,所以我真的在问./,因为我不知道它,并且输出“找不到命令”使我对命令的真正含义感到困惑。

内容:

我想安装该文件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'”。您需要从解压缩文件的目录中运行此命令。
查尔斯·格林

2
@Videonauth-并非如此,就我个人而言,我认为它没有达到答案的水平。
查尔斯·格林

1
@Zanna我测试了没有执行权限的脚本,并且抛出的错误是缺少权限错误,未找到命令。
查尔斯·格林

2
@ubuntubu好,很好,您已经移动到目录了-很好。不过,对编辑的评论很少。该命令应为chmod +xchmod -x反之则是-它删除可执行权限
Sergiy Kolodyazhnyy 17-10-27

4
问题标题与正文完全不同。也许应该解决?
David Z

Answers:


24

./不是命令。命令是./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.在这种情况下或一般而言,没有必要;所需的是/路径名中的某处,以表示您是路径名。

由于.始终是当前目录,/而只是目录分隔符,因此首先要做的就是检查您命名的文件是否确实存在于当前目录中。(如果有,请按照Charles Green的说明检查其权限。但是,如果您从存档中提取文件,则如果打算运行该文件,则通常已经具有可执行权限。)


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$

文件“ 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

1
不完全的。它列出rw-了您的许可-在-设置位和粘性位之前。
邓肯·辛普森

@DuncanXSimpson谢谢-我更新了一些权限说明,但是我将忽略此答案的setguid和粘性位!
查尔斯·格林

8

Shell中的调用命令如何工作

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

如果要运行的命令与您当前所在的目录位于同一目录但该目录不在PATH目录列表中,该怎么办?那是您需要使用的时候./。它与执行操作的方式完全相同/bin/bash-您正在告诉外壳程序所需命令的位置,以及该命令的完整路径。如果是./,则是说要外壳“在此目录中查找”。重要的一点是,您必须位于文件所在的目录中。

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

所以重要的步骤:

  1. cd 文件的保存位置;如果它在~/Downloads,然后cd ~/Downloads
  2. 运行chmod +x ./truecrypt-7.2-setup-x86,显示“ 目录可执行文件中的make文件truecrypt-7.2-setup-x86 ”
  3. 现在做 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提出的问题的核心。

文档和参考

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

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

为什么前脚本名称你需要./(点斜杠)在bash中运行呢?

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


实际上sudo输出是误导的。如果不尝试同样的操作sudo,将会从bash:中得到另一个错误Permission denied。没错,因为您没有授予脚本执行权限(通过chmod +x)。
Ruslan

@Ruslan sudo输出令人误解的事实是正确的,但这就是所显示的错误。这可能是要报告给开发人员并让他们解决的问题。但是,这不是讨论的核心-我们需要确定OP为产生此类错误所做的工作,并将其引导至正确的路径。是否具有误导性-这不是这里的问题。
谢尔吉·科洛季亚兹尼

换句话说,它与using 并不完全相同/bin/bash:它不允许您执行没有执行权限的脚本。当用开头脚本名称时/bin/bash/bin/bash可执行的事实就很重要,因为是正在执行的命令。如果您不这样做,那么脚本本身就会被执行,从而导致您当前的shell或最上面#!一行的内容被调用
Monty Harder

@MontyHarder /bin/bash在这里仅仅是一个例子。我们正在调用/bin/bash./script.sh 通过指定 要执行的操作的路径这一事实-是相同的。脚本作序用bash script.sh或者/bin/bash script.sh完全不同的主题,在那里你运行一个可执行文件和脚本传递给它作为参数-它的方式可以突破,如果语法比外壳你打电话,说以外的东西写csh/bin/bash是可执行文件,但事实是您仍在指定它的完整路径。
Sergiy Kolodyazhnyy

2
@SergiyKolodyazhnyy一作序脚本名称与/bin/bash甚至仅仅bash解决了缺乏脚本可执行权限的常用方法。指定完整的脚本路径并没有解决这个问题。因此,/bin/bash在这种特殊情况下一个特别坏的榜样。
Monty Harder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.