bash命令会生成奇怪的行为

bash命令会生成奇怪的行为,bash,command,Bash,Command,我正在学习bash,碰巧在bash中键入了var=“$(cat)”,奇怪的是它进入并消失了bash提示符,直到我使用ctrl-c 什么是命令var=“$(cat)” 写入var=$(cat)意味着您试图存储执行命令cat的子shell的输出。但是,在没有参数的情况下执行cat相当于cat STDIN(也与cat-相同),如果您没有正确终止输入流,cat仍将从STDIN读取,直到它被中断(这就是为什么您认为提示消失了,但实际上您在子shell中的原因) 由于您正在将SIGINT信号(CTRL+C)

我正在学习bash,碰巧在bash中键入了
var=“$(cat)”
,奇怪的是它进入并消失了bash提示符,直到我使用ctrl-c

什么是命令
var=“$(cat)”

写入
var=$(cat)
意味着您试图存储执行命令
cat
的子shell的输出。但是,在没有参数的情况下执行
cat
相当于
cat STDIN
(也与
cat-
相同),如果您没有正确终止输入流,
cat
仍将从
STDIN
读取,直到它被中断(这就是为什么您认为提示消失了,但实际上您在子shell中的原因)


由于您正在将
SIGINT
信号(
CTRL+C
)发送到(sub)进程,因此命令以及subshell以非0状态退出(您可以在
var=$(cat)
之后检查执行
echo$?
的退出状态,对于由
SIGINT
终止的进程,它应该等于130)。或者,您可以尝试将某些内容写入上述子shell的
STDIN
,然后发送
CRTL+D
,当在给定终端上的行首键入时,它表示输入结束,而不是
CTRL+C
。最后,您可以键入
echo$var
,以检查变量分配是否按预期工作。

更正:没有子shell。
$()
中的命令非常简单,bash不需要麻烦,只需将
cat
命令作为子进程运行即可。(这是
cat
,不是子shell,它在不给出任何提示的情况下接受输入。)此外,如果问题确实正确,则“
=
”周围有空格,这会显著改变命令的含义。有趣。AFAIK进程替换调用子shell(父shell的子进程,因此是子进程?)。bash是否有任何机制可以根据给定命令的复杂性选择wheter只执行命令或整个命令解释器实例?关于空格,我猜(默认情况下)是写错了。但是,是的,完全同意你的看法。我不确定这是否完全正确,但它似乎只在有任何一个以上的基本命令的情况下创建子shell,所以
$(cat)
直接运行
cat
,但是
$(cat | cat)
$(cat;cat)
都创建子shell(然后在适当的配置下运行两个
cat
实例)。顺便说一句,
bash
zsh
dash
似乎都是这样做的。对于原始命令:
var=$(cat)
var=“$(cat)”
都按照您的描述执行,但是
var=“$(cat)”
尝试运行命令
var
,第一个参数是“=”,第二个参数是
cat
的输出。我们很可能在谈论同样的事情,在我看来,关键是“subshell”概念本身:,而且(顺便说一句,在我上面的评论中,我指的是命令替换而不是进程替换)。
bash-3.2$ var = "$(cat)"

^C
bash-3.2$