我发现了一件我无法用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
那里有双冒号。为什么会有区别?
答案 0 :(得分:3)
3-1
。您获得的错误消息将发送到标准错误,而不是标准输出。因此,$(3-1)
未运行
3-1: command not found
它正在运行3-1
并且失败了。如果您尝试运行错误消息,则第一个单词作为命令,其余的是参数。找不到命令3-1:
,因此带有两个冒号的错误消息。
答案 1 :(得分:2)
你打算用3-1
做什么?如果你想执行它我怀疑你有程序3-1
或2
。试试这样:
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:”并添加“:回复”