路径中的新目录。

路径中的新目录。

我正在尝试从 $PATH 中删除单个可执行文件,而不对其进行修改

例如,我有/Users/USER/Library/Python/2.7/bin/in $PATH,并且我想services.py从该目录中排除。

我知道chmod -x services.py会起作用,但我正在努力寻找更好的方法

是否可以?

答案1

如果您可以将文件移动到子目录中,就可以避免其执行。
如果不能,有一些解决方法:

您可以添加更高优先级的内容,以便它在您试图避免的可执行文件之前执行。

路径中的新目录。

您可以在 PATH 顺序中的更高级别创建可执行文件。

如果$PATH/usr/local/bin:/usr/bin:/bin,则 处的(空?)可执行文件/usr/bin将以比 处的可执行文件更高的优先级执行/bin

在这个方向上,您可以在的开头添加一个路径,$PATH以确保新的可执行文件在之前执行(替换)services.py

请注意,某些 shell 会记住程序的执行路径。在 bash 中由命令控制hash(hash -r 将删除所有散列程序)。新的 bash shell 没有散列程序,除了在起始文件中执行的程序(通常是~/.bashrc和/或~/.profile)。因此,PATH一开始就具有新功能的新外壳将起作用。

如果您无法更改 PATH 或移动文件,您可以使用 中的函数或别名定义~/.bashrc,或其他一些启动文件,例如~/.profile.

函数和别名比可执行文件具有更高的优先级,因此,像可执行文件一样命名函数(或别名)将有效地在定义了此类函数的 shell 中替换它。

功能

像这样简单的事情就可以做到:

services.py(){ :; } # do nothing

为了测试,你可以设置ls为空:

ls(){ :; }

可以使用 删除函数unset -f FunctionName

 $ unset -f ls

删除该ls功能。

请注意,函数并不完美,可以使用完整路径调用原始可执行文件:

$ /bin/ls
listOfFiles

函数将仅阻止“此 shell”执行程序。任何其他 shell(或可以execve自行调用的程序)都将运行可执行文件。

别名

别名的功能较弱,它仅替换简单命令的第一个单词。
如果命令有某种形式的引用,它将避免使用别名。

$ alias ls='echo "none"'
$ ls
none
$ \ls
ListOfFiles

可以使用 删除别名unalias AliasName。因此,如下所示:

 $ unalias ls

将删除 的别名定义ls

更改 PATH 的最可靠方法。通过预先设定一个新目录或将文件移动到新目录。$PATH仅在允许执行程序的实例中包含此类目录。

相关内容