1

我编写了一个脚本来简化 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

假设“樱桃”变量是:

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

我无法弄清楚它为什么会失败。

它调用的“修剪”函数是修剪前导和尾随空格的函数。如果我在 for 循环中回显“$CHERRY”,命令会正确打印,但仍然失败。

4

2 回答 2

3

我再举一个例子:

cmd='echo hello && echo world'
$cmd

结果是:

hello && echo world

bash 将命令解析$cmdSimple Commandsnot Lists of Commands
之后Parameter Expansion&&作为参数传递给echo(之后的第一个单词Word Splitting)。


解决方案是&&退出:

cmd1='echo hello'
cmd2='echo world'
$cmd1 && $cmd2
于 2012-09-18T14:24:32.690 回答
0

一旦你放入&&一个变量,它就不再被解释为分隔两个命令:

$ A="echo a && echo b"
$ echo $A
echo a && echo b
$ echo c && ${A}
c
a && echo b

所以你需要避免放入&&一个变量。

git 甚至&&在其错误消息中告诉您这是问题所在。

于 2012-09-18T14:23:54.523 回答