a.out
在使用 Ubuntu 终端执行 C 程序时,为什么我总是需要./
在之前输入a.out
,而不是直接输入a.out
?有解决方案吗?
答案1
当你输入某个程序的名称时,a.out
系统会在你的 PATH 中查找该文件。在我的系统中,PATH 设置为
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
您的情况可能类似。要检查,请echo $PATH
在终端中输入。
系统按照给定的顺序查找这些目录,如果找不到,程序就会产生错误command not found
。
在命令前面加上./
“忘记 PATH,我希望你只查看当前目录”实际上表示“忘记 PATH,我希望你只查看当前目录”。
类似地,您可以通过在命令前面添加相对或绝对路径来告诉系统仅在另一个特定位置查找,例如:
../
表示在父目录中,例如../hello
在父目录中查找 hello。
./Debug/hello
hello
:“在我当前目录的 Debug 子目录中查找。”
或:“在目录中/bin/ls
查找”ls
/bin
默认情况下,当前目录不在路径中,因为它被视为安全风险。请参阅为什么 . 默认不在路径中?请超级用户解释原因。
可以将当前目录添加到您的 PATH,但是由于链接问题中给出的原因,我不建议这样做。
答案2
这样做的原因是简单的。
假设您有一个与当前目录中的应用程序同名的命令。然后在 shell 中运行该命令将调用您的应用程序反而内置命令。这至少会是一个安全问题。
通过要求./
在前面使用,shell 知道您想要执行具有给定名称的应用程序而不是具有该名称的内置命令。
答案3
./
执行不在您的 中的文件$PATH
,而是执行当前目录中的文件(或通过 执行另一个目录./home/stefano/script.sh
)。现在,PATH 是一个环境变量,它包含 bash 可以查找可执行程序的所有位置,而无需它们的完整(绝对)路径。
需要进行这种区分以避免运行错误的文件。例如,如果您ls
的主目录中有一个名为的文件,则该文件不在您的 PATH 中,这将防止 bash 将其与实际文件混淆ls
。PATH 变量还定义搜索顺序:
- 当您运行命令或程序尝试进行
exec
系统调用(内核的一种特殊方法,程序的启动方式)时,系统会通过遍历 PATH 中的每个目录来查找文件。一旦找到程序,即使它在多个目录中,搜索也会中断,并运行找到的第一个程序。
要运行文件,您需要在权限中设置可执行位:
由于您已经在命令行上,因此您只需输入
chmod +x finename
。或者您可以通过右键单击文件并选择来设置权限特性:
您现在可以将文件复制到 PATH 中的任何目录,以查看其中有哪些目录 - 并且它们是根据每个用户设置的 - 类型echo $PATH
。
stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
如果您创建可执行文件 ,cat
并将其移动到/usr/local/sbin
,则会运行该文件,而不是cat
位于 中的正确的 。您可以使用和/bin
来找出文件的位置。type cat
whereis cat
答案4
正如乔治在他的回答中指出的那样,这有助于你注意到你的执行当前工作目录中的文件 ( pwd
)。
我记得很久以前问过我的学长这个问题,他说我应该添加.
到我的路径中,这样当我这样做时,a.out
它会在当前目录中查找并执行它。在这种情况下,我不需要这样做./a.out
。
但就我个人而言,我建议不要这么做。我从来没有遇到过这种情况,但如果你在一个外星网络目录或某个地方,并且ls
那里存在一个名为的恶意可执行文件,那么.
在你的路径中放置它是一个非常糟糕的主意。并不是说你会经常遇到这个问题,只是说说而已。