我需要在CentOS 5.3 集群上调用程序的修改版本/home/user_name/bin
而不是(旧)版本。/opt/program_name/current
该程序使用 python 创建一个 tcsh 脚本,然后执行该脚本。
我可以覆盖 PATH 以调用 中程序的修改版本~/bin
,从而which program_name
标识 n 的路径~/bi
。我已经在 、 、 和 中完成.bashrc
了.profile
此.tcshrc
操作.cshrc
。但是,每次执行 tcsh 时,/etc/profile
都会加载环境变量 from 并将路径恢复为/opt/program_name/current
.
/etc/profile.d/program_name.sh
这些特定于程序的变量在调用时设置/etc/profile
:
# /etc/profile
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
done
unset i
因此,当program_name.sh
调用时,对应的脚本为:
# /etc/profile.d/program_name.sh
setenv PATH ${PATH}:/opt/program_name/current
如何防止/etc/profile
我的用户帐户被访问?
我没有 su 访问权限,并且其他用户仍在使用旧版本的软件,/opt/program_name/current
因此我无法更新软件或修改设置/etc/profile.d/program_name.sh
答案1
tcsh 不会自发读取/etc/profile
,脚本中一定有某些内容导致了这种情况。一种可能的可能性(但不是唯一的可能性)是脚本以 开头#!/bin/tcsh -l
,因此 tcsh 充当登录 shell。这仍然不会导致它读取/etc/profile
,但它会导致它读取/etc/csh.login
,这可能会读取其他文件(我不知道 CentOS 附带什么,csh.login
也不知道您的系统管理员如何定制它)。
读取后/etc/csh.login
,tcsh 读取~/.login
。根据它的配置方式,它可能会在~/.login
之前、之后或代替~/.tcshrc
.所以一定PATH
要尝试覆盖~/.tcshrc
。
如果这不起作用,修改 Python 脚本可能是您最好的选择。如果代码位于模块中,您可以通过放置一个包装器模块来解决它,该模块会PYTHONPATH
加载原始代码并进行一些更改。
如果失败,则没有简单的方法可以“重定向”程序可执行文件或 tcsh 的访问。原则上,通过使用包装一些文件访问函数是可能的LD_PRELOAD
(如果涉及的所有程序都是动态链接的并且没有设置[ug]id),但工作量很大。
很可能有一种更简单的方法,可以通过挂钩到脚本的某个地方,例如,使用.cshrc
.如果没有看到那个脚本,很难说得更准确。
答案2
你最好的选择可能是不依赖PATH
而是给出 的完整路径program_name
。
至于为什么它要获取 /etc/profile,它必须由/etc/csh.chsrc
或 可能调用/etc/csh.login
。有关更多信息,请参阅man
的页面tcsh
。具体来说,查找(搜索)以下部分Startup and shutdown
和FILES
在手册页中。
从启动和关闭,这是最相关的部分:
登录 shell 首先执行系统文件
/etc/csh.cshrc
和/etc/csh.login
/ 中的命令。然后它从用户主目录中的文件执行命令...
非登录 shell 只读
/etc/csh.cshrc
或 启动时~/.tcshrc
读取。~/.cshrc
并从文件(涵盖所有 *nix 风格):
/etc/csh.cshrc Read first by every shell. ConvexOS, Stellix and Intel use /etc/cshrc and NeXTs use /etc/cshrc.std. A/UX, AMIX, Cray and IRIX have no equivalent in csh(1), but read this file in tcsh anyway. Solaris 2.x does not have it either, but tcsh reads /etc/.cshrc. (+) /etc/csh.login Read by login shells after /etc/csh.cshrc. ConvexOS, Stellix and Intel use /etc/login, NeXTs use /etc/login.std, Solaris 2.x uses /etc/.login and A/UX, AMIX, Cray and IRIX use /etc/cshrc.