如何在bash别名中加入循环?

3

我试图创建一个别名,它会遍历几个文件夹并运行构建命令,但我一直得到的输出只是显示 for >

这是我在 .zshrc 文件中拥有的一个函数。

recurse_build () {
    for src in `ls`; do 
        cd $src; build; cd ..
    done
}

我正在尝试创建一个别名

alias br='recurse_build'

但是我最终得到了以下提示。
for > 

希望能得到任何帮助。

编辑:修复函数中的语法错误。是手打错误而不是复制粘贴。


为什么不直接使用函数而不是别名呢?顺便说一下,你的函数中有一个语法错误。 - undefined
为什么要定义一个函数并将其映射到一个别名?直接使用函数all有何用途? - undefined
你的函数定义有问题(目前发布的版本);请在shellcheck.net上进行分析。 - undefined
@Inian,我没有想到直接运行函数,所以我使用了别名。当我运行函数时,它起作用。 - undefined
2个回答

6

除了命令替换中缺少反引号外,这种迭代文件的方法是错误的。使用 glob 模式。

recurse_build () {
    for src in */; do
        pushd "$src" || continue   # Don't do anything if pushd fails
        build
        popd
    done
}

使用 pushdpopd 比记住要返回到哪里更加简洁。

修复了缺失的反引号,并且我之前不知道在bash中可以用这种方式迭代文件。我刚刚尝试了你建议的语法,但是仍然只得到了for > 提示符,而没有实际进行构建。让我看看能否调试一下。编辑:直接调用函数似乎可以工作。虽然在别名中无效,但我可以处理只调用函数的情况。 - undefined

1

可能是右边缺少了反引号,但通常处理ls的输出是不明智的。这样做可以解决问题。

recurse_build(){
    for src in */; do
        cd "$src" && ./build && cd ..
    done
}

#TEST 
mkdir -p a b c 
echo 'echo $PWD:$0' |tee a/build b/build c/build >/dev/null
chmod  +x a/build b/build c/build 


recurse_build

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接