Bash:虚假的“命令未找到”消息(我认为)

时间:2011-05-16 20:57:05

标签: bash

我正在尝试在Bash中编写一个简单的实用程序函数,它将在给定目录中执行“操作”。所以我基本上抽象了“转到目录,做某事,然后回来”模式。

inDir() {
    if [$# -le 1]; then
        return;
    else
        local dir="$1";
        local action="$2";
        local cwd=`pwd`;

        if [ -d "$dir" ]; then
            cd "$dir";
            $action;
            cd "$cwd";
        else 
            return;
        fi
    fi
}

不幸的是,当我运行它时,我得到了我认为是一个虚假的错误,我不知道它来自哪里。例如:

$ inDir "/tmp" "touch hi"

正确创建文件/ tmp / hi,但也会出错:

[2: command not found

我不确定这对于阅读错误是否重要,但我的提示以“[”开头。

任何帮助?

4 个答案:

答案 0 :(得分:6)

尽管它看起来像什么,'['实际上是一个名为test的命令,所以:

if [$# -le 1]; then

应该是:

if [ $# -le 1 ]; then

注意'['和下一位代码之间的空格。没有它,代码读作

test$#
我认为这显然是错误的。在结束方括号之前还需要一个空格,它不是命令,而是分隔符。

答案 1 :(得分:1)

@NeilButterworth答案是对的。

bash尝试解决上述常见错误,并引入了内置的数字比较结构(())。 例如:

if (($# < 1)); then
fi 

优先于[]结构的优点是它使用常规比较运算符(例如&lt;,&gt;,==),并且不需要[]所需的空格。

对于字符串比较,有类似的结构[[]]

答案 2 :(得分:0)

如果使用子壳

,生活会更简单
( cd "$dir"; $action )

对当前shell没有影响。

答案 3 :(得分:0)

这可以帮助您处理更复杂的参数

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

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

所以现在你可以这样做:

inDir /foo touch "file name with spaces"