我在 Linux 环境中工作,用户的 shell 默认配置为
csh
。我正在编写一个 git
post-receive
钩子,该钩子应该在用户处于非交互式 csh
shell 中时触发。
我的 git hook 具有以下行。这样我就可以检查环境中是否配置了正确的版本。
echo "Versions: git (`git --version`), composer (`composer --version`)"
正确的版本在
.cshrc.private
中通过两种方式配置:
setenv
# Add local git to path
setenv PATH ~/software/git/bin\:$PATH
alias
# Add local composer alias
alias composer /path/to/composer/composer.phar
我注意到的是
setenv PATH
可以工作,但是 alias
没有在脚本中被拾取 - 导致钩子中使用了不正确的版本。用符号链接和 PATH 条目替换它确实有效。
什么会导致这种行为?
不能代表你的确切问题,但我正在努力解决一些类似的问题,但从不同的角度来看(我试图在vim中使用一些别名
:!shell_command
),也许这条消息确实对你有帮助。请注意,这一切均在 RHEL8 下的 tcsh 6.20.00 (Astron) 中进行了测试
首先,env 变量是由子 shell 继承的。例如,在这里您将看到 $MYENV 在子 shell 上展开
env -i MYENV=hola csh -c "echo $MYENV"
hola
但是别名不会被继承:
alias myalias 'echo hola' && csh -c "myalias"
myalias: Command not found.
但是,您可以在 .cshrc 上定义别名,这些别名将在非交互式 shell 上可用。不要过多使用这些别名,因为它们会减慢这些 shell 的速度,并可能改变脚本执行(无论是由于别名或脚本未在具有不同别名的其他用户下运行而导致意外行为)。为了保护只有非交互式 shell 应该读取的 .cshrc 区域,我使用以下内容
# This will load only for non-interactive shells, e.g. scripts, vim terminal commands etc., some *quick to load* aliases can be define here:
if ($?USER == 0 || $?prompt == 0) then
# These are things I find myself trying to do from vim...
alias h 'history 100'
endif
另请注意,如果您使用
#!/bin/csh -f
shebang 启动脚本,您还可以告诉脚本不加载任何启动文件。在这些情况下,别名或任何其他设置都不会意外潜入。无论如何,我不太关心这个,因为我根本不使用 csh 来编写脚本。
说了这么多,我认为你需要检查 git hook 是否正在与该 shebang 一起运行(因此没有加载任何 .cshrc)或者 .cshrc (你提到的
.cshrc.private
?)是否正在加载。可能是您的 .cshrc.private 或 .alias 来源有一个 if ($?prompt == 0 ) exit
b/f。