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

发布于 2024-11-07 18:44:58 字数 627 浏览 0 评论 0原文

我正在尝试在 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

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

有什么帮助吗?

I am trying to write a simple utility function in Bash, which will perform an "action" in the given directory. So I am basically abstracting the "go to a directory, do something, and come back" pattern.

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
}

Unfortunately, I get what I think is a spurious error when I run this, and I'm not sure where it is coming from. For example:

$ inDir "/tmp" "touch hi"

correctly creates the file /tmp/hi, but also gives the error:

[2: command not found

I'm not sure if this matters to reading the error, but my prompt starts off with a "[".

Any help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

溺ぐ爱和你が 2024-11-14 18:44:58

不管它看起来像什么,“[”实际上是一个名为 test 的命令,因此:

if [$# -le 1]; then

应该是:

if [ $# -le 1 ]; then

注意“[”和下一段代码之间的空格。如果没有它,代码读起来

test$#

我认为显然是错误的。您还需要在右方括号之前有一个空格,它不是命令,而是分隔符。

Despite what it might look like, '[' is actually a command called test, so:

if [$# -le 1]; then

should be:

if [ $# -le 1 ]; then

Note the space between the '[' and the next bit of code. Without it, the code reads as

test$#

which I think is obviously wrong. You also need a space before the closing square-bracket, which isn't a command, but is a delimiter.

内心荒芜 2024-11-14 18:44:58

@NeilButterworth 答案是正确的。

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

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

[] 结构的优点是它使用常规比较运算符(例如 <、>、==)并且不需要 [] 那样的空间做。

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

@NeilButterworth answer is correct.

bash tries to solve the above common error and introduces built-in numeric compare structure (()).
For example:

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

The advanteges over [] structure is that it used regular compare operators (e.g. <, >, ==) and doesn't requires space as [] does.

For string comparison there's similar structure [[]]

给我一枪 2024-11-14 18:44:58

如果使用子 shell,生活会更简单

( cd "$dir"; $action )

对当前 shell 没有影响。

Life is simpler if you use sub-shells

( cd "$dir"; $action )

Has no effect on the current shell.

无人问我粥可暖 2024-11-14 18:44:58

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

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"

This may help you with handling more complex arguments

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

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

So now you can do something like:

inDir /foo touch "file name with spaces"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文