【发布时间】:2021-01-21 01:51:14
【问题描述】:
我最近从 bash 迁移到 zsh,和大多数人一样,我有我的自定义 bash 别名/函数来简化 git 和 env 采购操作。特别是其中有 2 个在 zsh 上运行时无法正常工作,但在 bash 上却完全正常。
export REPO_ROOT=/home/pablo/repos/my_repo
alias croot='cd $REPO_ROOT'
alias subroot='cd $REPO_ROOT/subrepo/subrepo_1/'
repcheckout(){
git checkout "$1"
if [ $(pwd) == $REPO_ROOT ]; then
subroot
else
croot
fi
git checkout "$1"
if [ $(pwd) == $REPO_ROOT ]; then
subroot
else
croot
fi
}
我的想法是我有一组 main_repo-submodule 分支,当我签出主仓库时,我想签出相应分支中的子模块,而不是这样做:
$ git submodule update --init --recursive subrepo/subrepo_1
它检查了子模块中的正确提交,但没有更新我切换到某个本地分支。
对于之前的func,zsh在运行时抛出的错误
$ repcheckout my_cool_branch
是
M subrepo/subrepo_1/
Switched to branch 'my_cool_branch'
repcheckout:2: = not found
后来我有一个 setup.sh 文件,我获取它的来源如下:
add2path() {
if ! echo ${!1} | egrep "(^|:)$2(:|\$)" > /dev/null ; then
declare -g $1="${!1}:$2"
export "$1"
fi
}
# GENERATED BINARY A
export BIN_A_HOME="$REPO_ROOT/bin_a"
add2path PATH "$BIN_A_HOME/bin"
与使用相同的 add2path 添加到 PYTHONPATH 的一些生成的 python 模块相同
哪个会导致错误:
add2path:1: bad substitution
【问题讨论】:
-
您可以将条件重写为
[[ $PWD == $REPO_ROOT ]]。无需创建仅用于检查工作目录的子进程。使用[[ ... ]]还允许您使用==运算符。顺便说一句,${!1}在 zsh 中也不起作用。一般来说,盲目地在另一种语言下运行为一种语言编写的代码是没有意义的,即使这些语言有相似之处。