我正在尝试从 $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
仅在允许执行程序的实例中包含此类目录。