当命令包含管道时,将命令输出存储在变量中

当命令包含管道时,将命令输出存储在变量中

如何将命令的输出存储在变量中?这就是我正在做的事情,但没有存储任何内容。看起来管道是问题所在,但我不知道如何进行调试。

这按预期工作:

$ var=$(printf "hello \n world")
$ echo $var
hello world

就像这样:

$ printf "hello \n world" | wc -l
1

这不会:

$ var=$(printf "hello \n world" | wc -l)
$ echo $var

$ #previous command returns nothing

在第三个例子中我如何var存储?1

编辑:在 Cygwin 上使用 bash。

编辑2:跑步与bash -x

$ bash -x
+ [[ -z '' ]]
+ CYG_SYS_BASHRC=1
+ [[ himxBH != *i* ]]
+ export 'EXECIGNORE=*.dll'
+ EXECIGNORE='*.dll'
+ PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '
+ [[ himxBH != *i* ]]

$ var=$(printf "hello \n world" | wc -l)
+ var=

$ echo $var
+ echo

编辑3:

$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

编辑4: set +o posix正如建议的@乔治瓦西利乌在对我的答案的评论中(现已被版主删除,并复制在下面)不会更改输出。


由于某种原因,反引号语法对我有用,但对我$(...)不起作用

$ var=`printf "hello \n world" | wc -l`
++ printf 'hello \n world'
++ wc -l
+ var=1

$ echo $var
+ echo 1
1

如果有人可以解释为什么会发生这种情况,更重要的是如何解决它,那么这个答案应该是公认的答案。

答案1

[编辑以按照建议添加链接摘要] 这与您将 Cygwin 与某些软件一起使用这一事实有关,导致它在 Windows 上行为异常。有问题的软件列表称为 BLODA。检查下面的链接以获取更多信息:

第一个链接是 BLODA 的官方 Cygwin 定义。软件,通常是防病毒类型,实现各种挂钩,例如进程执行 fork() 或访问文件甚至内存区域时。此类软件会阻止 Cygwin 和 bash 正常运行,解决方案是通过为 Cygwin 的安装目录添加例外来禁用扫描,或者完全禁用/卸载该软件。

第二个链接指向一个邮件列表问题,该问题的表现与本文作者所描述的完全一样,并且有人回答了指向 Cygwin 常见问题解答的 BLODA 部分的问题。

相关内容