![在 Bash 中的括号子 shell 中获取 rcfile 吗?](https://linux22.com/image/1561014/%E5%9C%A8%20Bash%20%E4%B8%AD%E7%9A%84%E6%8B%AC%E5%8F%B7%E5%AD%90%20shell%20%E4%B8%AD%E8%8E%B7%E5%8F%96%20rcfile%20%E5%90%97%EF%BC%9F.png)
在 zsh 中,通过括号创建的子 shell 可以有一个 rcfile 作为源来使用可能是别名的命令,仅在向其中添加特定目录时可用PATH
,等等:
~ » /bin/zsh -c "workon"
zsh:1: command not found: workon
------------------------------------------------------------
~ » /bin/zsh -c "source ~/.zshrc; workon"
env1
env2
env3
... (expected output)
然而,对于 bash 来说情况并非如此:
~ » /bin/bash -c "workon"
/bin/bash: workon: command not found
------------------------------------------------------------
~ » /bin/bash -c "source ~/.bashrc; workon"
/bin/bash: workon: command not found
------------------------------------------------------------
~ » bash
sean@helium:~$ workon
env1
env2
env3
... (expected output)
有没有什么方法可以让 bash 子 shell 获得 rcfile 呢?
为了抢先了解“XY 问题”的响应,这里有一个名为的脚本in
:
#!/bin/zsh
(source ~/.zshrc; cd $1; ${@:2})
我有一个充满项目的目录(使用 git),我经常忘记是否留下任何未提交的内容,因此in
允许我快速写入$ in ProjectDir/ git status
,而不是$ (cd ProjectDir; git status)
(前者感觉比后者更容易输入)。
最好的情况下,我希望这个脚本可以在 bash 中使用(这就是我问的原因,尽管它目前可以在 zsh 上使用)。
答案1
在我的 Kubuntu 中,第一件事.bashrc
是这样的:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
我猜你的.bashrc
也类似。这就是为什么/bin/bash -c "source ~/.bashrc; …"
“不”引用。如果你使用,bash -i -c …
那么.bashrc
将自动引用,而你的source
将不必要地第二次解析它。