我的目标是在我拥有的许多shell帐户之间共享一组点文件,以便我可以在每个帐户中拥有类似的环境。因此,我不想在我的.git文件或我的.bash文件中使用特定于机器/环境的信息。
在我的MacOSX计算机上,默认的emacs版本为22.我已在/usr/local/bin
中安装了较新版本的emacs(24)。在我的.bashrc文件中,我将默认编辑器设置为emacs:export EDITOR=emacs
。在此之前,我还设置了我的路径,以便/usr/local/bin
出现在/usr/bin
之前,以便选择较新版本的emacs。
当我使用git创建提交消息时,它总是选择/usr/bin
中的那个而不是/usr/local/bin
中的那个。 Git忽略了我的$PATH
设置。我曾经在我的.gitconfigure文件中硬编码我想要的emacs版本的位置,但是当我在我的Ubuntu服务器上使用相同的.gitconfigure文件时,这不起作用。 (如果不清楚,我所说的是修改我的.gitconfigure编辑器选项以指向硬编码对我来说不起作用。)
为什么git不尊重我的$PATH
设置?
如何配置git以使用正确的emacs?
编辑:添加更多上下文
有人建议将环境变量放在.profile/.bash_profile
中。以下是我的.bashrc
和我的.bash_profile
.bashrc
注意:我写了一个名为vercomp
的bash函数来比较版本号。
OS=''
case $OSTYPE in
darwin*) OS='Mac' ;;
linux*) OS='Linux' ;;
*) OS='UNKNOWN' ;;
esac
export EDITOR=emacs
if [[ $OS = 'Mac' ]]; then
### EMACS VERSION CHECK
# make sure that we're working with emacs >= 24
wanted_ver=24
curr_ver=`emacs --version | grep -oE '[[:digit:]]+\.[.[:digit:]]*'`
vercomp $curr_ver $wanted_ver
# If vercomp returns 2, then our current emacs version isn't good enough.
if [[ $? == 2 ]]; then
if [[ -e '/usr/local/bin/emacs' ]]; then
emacs_path='/usr/local/bin/emacs -nw'
elif [[ -e '/Applications/Emacs.app/Contents/MacOS/Emacs' ]]; then
emacs_path='/Applications/Emacs.app/Contents/MacOS/Emacs -nw'
else
echo -n "EMACS VERSION OUT OF DATE: $curr_emacs_version. "
echo 'Install a newer version.'
emacs_path=''
fi
export EDITOR="$emacs_path"
alias emacs="$emacs_path"
fi
fi
.bash_profile
source ~/.bashrc
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell
session *as a function*
LESS=-FRX;export LESS
答案 0 :(得分:1)
我希望有一个答案解释为什么MacOSX不接我的 bashrc / profile环境的变化以及我可以获得的解决方案 MacOSX接受这些变化。
这不是特定于OS X的 - 这是一个例子:
$ uname -a
Linux hostname 3.13.7-gentoo #1 SMP PREEMPT Mon Mar 24 18:40:46 CET 2014 i686 Intel(R) Atom(TM) CPU 330 @ 1.60GHz GenuineIntel GNU/Linux
$ cat .bashrc
export EDITOR="emacs"
$ echo $EDITOR
/usr/bin/vim
$ mv .bashrc .bash_profile
$ logout
Connection to hostname closed.
$ ssh hostname
$ echo $EDITOR
emacs
我知道并习惯“生活”的是环境变量应该驻留在/etc/profile
(系统范围)内,并且可以在~/.profile
内分别在用户级别进行扩展和覆盖{ {1}}。
来自man bash
:
当bash被调用为交互式登录shell时,或者作为 使用--login选项的非交互式shell,它首先读取 并执行文件/ etc / profile中的命令,如果该文件 存在。读完该文件后,它会查找〜/ .bash_profile, 〜/ .bash_login和〜/ .profile,按顺序,并读取和 从第一个存在且可读的命令执行命令。
另一方面。 ~/.bash_profile
是放置自定义函数,别名,提示配置等的地方。
对于您的具体问题,一个简单的解决方案 - 除了在您的特殊情况下使用另一个git版本 - 只需将您的环境变量从.bashrc
移动到.bashrc
。
Linux From Scratch项目提供了一些非常好的examples about how to organize the bash shell startup files。 OS X中的特定问题在"Setting environment variables in OS X?"内解决。
答案 1 :(得分:0)
不在.bashrc
中设置变量。 Bash只在交互式会话中查看此文件,因此交互式会话之外的程序永远不会看到.bashrc.
对于bash,环境变量属于~/.profile
!。
要立即解决问题,您可以将$EDITOR
设置为绝对路径:
if [[ -e /usr/local/bin/emacs ]]; then
export EMACS=/usr/local/bin/emacs
else
export EMACS=emacs
但是,问题指出了环境设置中存在的更深层次问题,但您的问题目前缺少一些信息(请参阅我的评论)。
通常,$PATH
和环境变量在OS X上是混乱的,因为没有一个地方可以更改它们(例如,配置文件变量不会传播到桌面和GUI应用程序),并且因为OS X本身通过$PATH
与path_helper
进行对话。您需要特别注意设置变量的位置,并且需要使用exec-path-from-shell之类的解决方法来使您的环境变量在GUI应用程序中可用。
答案 2 :(得分:0)
任何程序都可以自由地将PATH设置为自己想要的内容 - 这种策略通常用于setuid
程序,以防止执行错误(或彻头彻尾的坏)可执行文件。
您需要了解Emacs Terminal.app 是否会创建一个运行~/.bashrc
,~/.bash_profile
,两者或其他内容的Bash。 (对不起,我是vim用户。)
答案 3 :(得分:-1)
试试这个:
export VISUAL=emacs
我刚从我的Ubuntu上的bash尝试export VISUAL=gedit
,现在git使用gedit
当从该终端呼叫时。