如何将命令的输出存储在变量中?这就是我正在做的事情,但没有存储任何内容。看起来管道是问题所在,但我不知道如何进行调试。
这按预期工作:
$ 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 部分的问题。