我试图将程序/文件的路径添加到 $PATH 中,但我不明白其中的指导原则,最后,它也不起作用。例如遵循此准则:
- 如果
export PATH=$PATH:[path/to/program]
只是一个临时解决方案,为什么要重复使用它? - 如果我添加出口路径函数.bashrc并更新它,它也不起作用。我怀疑这是因为我们还没有确定实际文件的名称?另一方面,错误消息提到命令:
Command "foo" not found...
所以这让我想到一个问题,系统如何在命令和程序之间做出判断?
答案1
如果 export PATH=$PATH:[path/to/program] 只是一个临时解决方案,为什么要重复使用它呢?
正如您所说,这是一个仅适用于单个会话的临时解决方案。
如果我将路径的导出函数添加到 bashrc 并更新它,它也不起作用。我怀疑这是因为我们还没有确定实际文件的名称?
.bashrc
每次打开活动终端时都会运行。如果在运行的脚本位置正确输入,它应该可以工作。如果您希望输入始终有效,例如从程序启动器运行的脚本,或从 Alt+F2 运行对话框运行,请将语句添加到.profile
。该文件在您登录时读取。
不,你的怀疑是错误的。一旦将(有效)目录添加到PATH
,系统就会在该目录中搜索与你在终端提示符下输入的命令匹配的文件名。
所以我想问一下,系统如何在命令和程序之间做出判断?
命令是您在终端中输入以执行某项操作的字符串。它可以是 shell 内置命令,也可以是可执行文件。可执行文件是已设置可执行位的文件。它可以是脚本(bash、python 等)或二进制代码。这可能是语义问题,但任何命令都对应于一些编程代码,无论是 shell 内置命令,例如cd
还是要启动的可执行文件,例如gedit
。
您可以指定可执行文件的完整路径名。然后 shell 将立即找到它并(尝试)执行它。
如果你只输入一个名称,shell 将开始搜索具有该名称的程序并执行:
它检查名称是否与内部命令相对应,即“shell 内置命令”。shell 内置命令作为命令解释器的一部分驻留在内存中,通常
bash
在 Ubuntu 上的交互式 shell 中。cd
、pwd
和echo
是set
shell 内置命令的示例(在 bash 中)。然后它开始查找哈希表,这是一种加快查找可执行文件的技巧。当您刚登录时,哈希表是空的。
然后,它会继续检查 中的每个文件夹
PATH
,按照文件夹列出的顺序。因此,如果路径为/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/games
,/usr/local/sbin
则会搜索字符串。如果未找到该字符串,系统将继续在下一个目录中搜索,/usr/local/bin
等等。ls
和chmod
是可执行文件的示例。
你可以通过以下命令了解你的命令type
。例如:
$ type man
man is hashed (/usr/bin/man)
$ type ls
ls is aliased to `ls --color=auto'
$ type chmod
chmod is /usr/bin/chmod
$ type pwd
pwd is a shell builtin
您可以使用以下命令识别并定位外部可执行文件which
:
$ which cd
$ which ls
/usr/bin/ls
答案2
您可能不需要更改 PATH。通常保持原样就很好了。考虑其他可能性之一:
将程序移动到 PATH 中已有的目录之一,特别是
/home/UserName/.local/bin
。在您的 shell 中为程序创建一个别名,这样您只需键入它的别名就可以执行该程序。
gedit ~/.bash_aliases
添加如下一行:
alias do-it='/path/to/program/program-name'
重新启动 shell 或执行
source ~/.bashrc
。使用别名执行:do-it
它的工作原理就像你直接调用该程序一样:
/path/to/program/program-name