是./(点斜线)命令?

问题的核心:

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

语境:

我想安装文件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会在命令包含至少一个/字符时将其视为路径名 。 自从. 代表您当前所在的目录,./ truecrypt-7.2-setup-x86将当前目录中的文件命名为truecrypt-7.2-setup-x86 。 如果没有这样的文件,或者有文件无法运行,那么您将收到一条错误消息。

当命令不包含斜杠时,将搜索$PATH中列出的目录,如Sergiy Kolodyazhnyy所说 。 不会自动搜索当前目录 – 建议放置.$PATH 。 这样,你不会意外地运行你不希望运行的东西,因为你碰巧有cd d到包含它们的目录。

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

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

该命令的./部分是说“查看当前目录,并从此处执行命令’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你想要的命令所在的位置,它是一个完整的路径。 在./的情况下你说要“查看这个目录”。 非常重要的一点是,您必须位于文件所在的同一目录中。

当然,为了实际运行可执行文件,它必须设置可执行位,因此您需要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 

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

文档和参考资料

bash 4.3手册,“COMMAND EXECUTION”部分:

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

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

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