我编写了一个脚本来简化Android源的同步和构建。我尝试添加一个函数来cherrypick补丁,但我无法让它正常工作。我知道这是因为正斜杠,但我不知道如何保护/逃脱它们。
部分代码是:
echo "Copy/paste the project folder, i.e. 'frameworks/base'"
read folder
echo ""
echo "Now paste the cherry-pick git link, i.e. 'git fetch <someproject> refs/changes/... && git cherry-pick FETCH_HEAD'"
read cherry
echo ""
Begin
clear
echo ""
export IFS="&&"
for x in $cherry
do
cd ${CM}/${folder}
CHERRY=$(trim "$x")
$CHERRY
done
让我们说'cherry'变量是:
git fetch http://r.cyanogenmod.com/CyanogenMod/android_frameworks_base refs/changes/68/22968/2 && git cherry-pick FETCH_HEAD
我会收到此错误:
/home/tristan202/bin/build_cm.sh: line 159: git fetch http://r.cyanogenmod.com/CyanogenMod/android_frameworks_base refs/changes/91/23491/2: No such file or directory
/home/tristan202/bin/build_cm.sh: line 159: git cherry-pick FETCH_HEAD: command not found
我无法弄清楚它失败的原因。
它调用的'trim'函数是一个修剪前导和尾随空格的函数。如果我在for循环中回显“$ CHERRY”,命令会正确打印,但仍然会失败。
答案 0 :(得分:3)
我将再举一个例子:
cmd='echo hello && echo world'
$cmd
结果是:
hello && echo world
bash将命令$cmd
解析为Simple Commands
而非Lists of Commands
在Parameter Expansion
之后,&&
作为参数传递给echo
(Word Splitting
之后的第一个字)。
解决方案是将&&
拉出来:
cmd1='echo hello'
cmd2='echo world'
$cmd1 && $cmd2
答案 1 :(得分:0)
将&&
放入变量后,它将不再被解释为分离两个命令:
$ A="echo a && echo b"
$ echo $A
echo a && echo b
$ echo c && ${A}
c
a && echo b
因此,您需要避免将&&
放入变量。
git甚至告诉你&&
是错误信息中的问题。