【发布时间】:2012-02-23 01:05:48
【问题描述】:
当在存储库中收到推送时,我需要运行某个命令。该二进制文件位于我添加到 .bashrc 的自定义路径中,并且可以在 shell 中正常工作。我写了一个小脚本作为 git hook。但是,.bashrc 添加似乎不会影响此脚本。
我尝试将bash ~/.bashrc 放在脚本的顶部,但没有奏效。如果我手动运行脚本,比如$ sh post-receive,它工作得很好。怎么了?
【问题讨论】:
当在存储库中收到推送时,我需要运行某个命令。该二进制文件位于我添加到 .bashrc 的自定义路径中,并且可以在 shell 中正常工作。我写了一个小脚本作为 git hook。但是,.bashrc 添加似乎不会影响此脚本。
我尝试将bash ~/.bashrc 放在脚本的顶部,但没有奏效。如果我手动运行脚本,比如$ sh post-receive,它工作得很好。怎么了?
【问题讨论】:
检查你的 .bashrc 在某些发行版中,在交互模式下不执行时会跳过脚本的结尾。 只需将您需要的有用的东西带到跳过部分即可。
看起来是这样的:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
【讨论】:
脚本可能以不同的用户身份运行,或者被调用时带有禁用交互功能和/或启动脚本的选项。应该是这样的;这里真的没有什么“错误”。
您可以添加. /home/you/.bashrc 作为快速而肮脏的解决方法;或者,更准确地说,直接修改脚本的 PATH ;或者,更恰当地说,将依赖项模块化,例如通过将代码放在一个单独的文件中,您可以从 .bashrc 和此脚本中获取该代码 - 但对于这种孤立的情况,这肯定是矫枉过正。
“包含”shell scipt 文件的命令称为“source”或“dot”;在 Bash 中,source 可用作同义词,但在适当的 Bourne shell 中,它是一个文字点(也称为句点,句号):
. /path/to/stuff
【讨论】:
post-update 钩子的一部分遇到的 Jekyll 依赖项非常有用。采购. ~/.bash_profile 可能是一种肮脏的方法,但考虑到大多数人将如何安装 rvm 和后续 gem,它很容易成为跨平台解决方案。
bash ~/.bashrc 生成了一个新的 shell,它执行名为 .bashrc 的文件,并且当该子 shell 退出时,该子 shell 中的任何状态都会自然丢失——在进入第二行之前,它必须这样做包含调用的 实际 脚本。
【讨论】: