在bash中输出$(3-1)

时间:2013-12-02 16:37:45

标签: bash

我发现了一件我无法用bash解释的事情。

命令:

$(3-1)
3-1: command not found

如果我一步一步地做,它将显示如下:

3-1
3-1: command not found

3-1: command not found
3-1:: command not found

那里有双冒号。为什么会有区别?

6 个答案:

答案 0 :(得分:3)

找不到

3-1。您获得的错误消息将发送到标准错误,而不是标准输出。因此,$(3-1)未运行

3-1: command not found

它正在运行3-1并且失败了。如果您尝试运行错误消息,则第一个单词作为命令,其余的是参数。找不到命令3-1:,因此带有两个冒号的错误消息。

答案 1 :(得分:2)

你打算用3-1做什么?如果你想执行它我怀疑你有程序3-12。试试这样:

n=$((3-1))
echo $((3-1))

我认为这里需要解释:

如果你用bash新行写

do_smth

它假定您要执行程序。 $(do_smth)表示:执行程序do_smth并捕获输出。所以,如果你用bash写新行

$(do_smth)

它假定您要执行do_smth,从命令获取输出并使用其获取的名称执行命令。 $(( $do_smth ))是另一个。它假定$do_smth是一个数学表达式,并允许您计算类似c的数学表达式。

答案 2 :(得分:0)

你输入:

foo

输出:

foo: command not found

你输入:

foo bar

输出:

 foo: command not found

所以bash认为空间分隔命令/参数。如果你使用:给出的命令,你也可以输入它:

输入:

foo:

输出:

foo:: command not found

foo替换为3-1,即可找到答案。

答案 3 :(得分:0)

当您键入bash找不到的任何命令时,您会收到表单

的错误消息
bash: <cmd>: command not found

因此,如果您输入3-1,则会获得

$ 3-1
bash: 3-1: command not found

如果您输入3-1:,则会获得

$ 3-1:
bash: 3-1:: command not found

答案 4 :(得分:0)

您的“一步一步”细分是错误的,因为您认为第一个“未找到命令”错误消息将成为$()的结果,因此会被重新解析为命令。这不会发生,因为$()仅捕获标准输出(fd 1)并且“未找到命令”消息被打印到标准错误(fd 2)。

如果你跑

$(3-1 2>&1)

你可能会得到更像你期望的东西。 (我无法完全重现您的结果,因为我的bash错误消息看起来与您的不一样。)

答案 5 :(得分:0)

shell看到了这个:

情况1

stdin-      "$(3-1)"   ( run non existent command "3-1" in a subshell ... )
Command-    "3-1"
Arguments- 
error-      3-1
reply-      "3-1" ": command not found"

情况2

stdin-      "3-1:" "command" "not" "found"
Command-    "3-1:"            
                 (note that the ":" you typed is seen as part of the command)
Arguments-  "command" "not" "found"
error-      3-1:
reply-      "3-1:" ": command not found"
               (^---^ and this is where the double colon comes from)

正如您所看到的, shell根本没有回复双重冒号!

它回应你的“3-1:”并添加“:回复”