Bash:传递复合命令

时间:2011-05-20 23:06:37

标签: bash

我有一个名为“inDir”的Bash函数,它抽象出“转到目录,做某事,然后回到起始目录”模式。它被定义为:

inDir() {
    if [ $# -gt 1 ]; then
        local dir="$1"
        local cwd=`pwd`
        shift

        if [ -d "$dir" ]; then
            cd "$dir" && "$@"
            cd "$cwd"
        fi
    fi
}

我正在尝试创建一个函数,其语义无关紧要,但基本上会运行:

inDir /tmp { [ -e testFile ] && touch testFile }

我希望“隐含的”语义清楚。我想进入一个目录,检查$ somefile是否存在,如果存在,则删除它。这不符合预期。如果我跑:

cd
inDir /tmp [ -e testFile ] && touch testFile

它检查/ tmp中是否存在testFile,然后尝试在〜中触摸它。任何人都可以想出一个调用inDir的好方法,以便接受“复合”命令吗?

2 个答案:

答案 0 :(得分:3)

indir() {
 if [ -d "$1" ]; then
  local dir="$1"
  shift
  (cd "$dir" && eval "$@")
 fi
}

indir /tmp touch testFile
indir /tmp "[ -e testFile ] && rm testFile"

答案 1 :(得分:2)

不。只需告诉它调用子shell。

inDir /tmp bash -c "[ -e testFile ] && touch testFile"