コマンドが変数に保存されると、ioリダイレクトは機能しません。

コマンドが変数に保存されると、ioリダイレクトは機能しません。

次のコマンドを使用すると、Webページに特定のコンテンツがあることを確認できます。何かを見つけなければ何も出力しません。

curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'

問題は、これをシェルスクリプトに追加すると、出力が抑制されなくなることです。

#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"

$TEST1
if [[ $? != 0 ]]; then
    #do something if exit status of last command not equal to zero
fi

VAL1スクリプトの出力を変数(

#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"
VAL1+=$($TEST1)
echo "result should be blank or the found grep $VAL1"

2>&1コマンドを直接実行すると期待どおりに機能しますが、スクリプトに追加すると出力がコマンドラインに直接表示されるのはなぜですか?

修正する

意見にあるJeffsのヒントを通して正しい方向に進むことができました。許容される回答は正しいです。私がスクリプトのために行ったことは、元の変数に割り当てようとしたコードを関数に移動して、すべて$( ... )が期待どおりに機能することです。

#!/bin/bash
# note that -z checks if variable is empty
test1() {
  VAL1=$(curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content')
  if [[ -z $VAL1 ]]; then
    VAL1=test1fail
  fi
}

test1
echo $VAL1

ベストアンサー1

jeff schallerでコメント協会鼻にいます。 Bashマニュアルの主な情報(https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion)

単純なコマンドを実行すると、シェルは左から右に次の拡張、割り当て、およびリダイレクトを実行します。

  1. パーサーが変数代入として表示する単語(コマンド名の前の単語)とリダイレクトはい後で処理するために保存
  2. 変数の割り当てや方向の再指定ではない単語拡大する(望むよりシェル拡張)。拡張後に残りの単語がある場合、最初の単語はコマンド名として扱われ、残りの単語は引数として扱われます。
  3. リダイレクトの実行上記のように(参照リダイレクト)。
  4. 各変数割り当てで「=」の後のテキストは、変数に割り当てられる前に、チルダ拡張、パラメータ拡張、コマンド置換、算術拡張、および引用符の削除が適用されます。

ステップ1リダイレクトを識別して保存します。
ステップ2では、変数の拡張が行われます。

シェルには手順1のリダイレクトは表示されません。

また関連:コマンドを変数に入れようとしましたが、複雑な場合は常に失敗します!

おすすめ記事