コマンドにパイプが含まれている場合は、コマンド出力を変数に保存する

コマンドにパイプが含まれている場合は、コマンド出力を変数に保存する

コマンドの出力を変数に保存するには?このようにしていますが、何も保存されていません。パイプに問題があるようですが、デバッグ方法がわかりません。

これは期待どおりに機能します。

$ 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

3番目の例では、どのように保存しますかvar1

編集する: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のインストールディレクトリに例外を追加してスキャンを無効にするか、ソフトウェアを完全に無効にすることです。

2番目のリンクは、この記事の著者が説明したものと正確に一致するメーリングリストの質問にリンクされており、誰かがCygwin FAQのBLODAセクションに関する質問に答えました。

おすすめ記事