パイプ割り当て変数

パイプ割り当て変数

簡単に保つために、次のことをしたいと思います。

echo cart | assign spo;
echo $spo  

出力:カート

そのようなassignアプリケーションがありますか?

私は交換を使用してこれを行うすべての方法を知っています。

答え1

使用している場合は、次のことができますbash

echo cart | while read spo; do echo $spo; done

残念ながら、変数"spo"はwhile-do-doneループの外側には存在しません。 whileループで欲しいものを達成できれば大丈夫です。

実際には、ATT ksh(pdkshまたはmkshではない)または素晴らしいzshで上記で書いたものをほぼ正確に実行できます。

% echo cart | read spo
% echo $spo
cart

したがって、別の解決策はkshまたはzshを使用することです。

答え2

echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }

これは、1行だけ出力する限り機能します(echo末尾の改行なしで出力を変数に保存します)。spoecho

いつでも次のことができます。

assign() {
  eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)

次の回避策はbashスクリプト内では機能しますが、bashプロンプトでは機能しません。

shopt -s lastpipe
echo cat | assign spo

または:

shopt -s lastpipe
whatever | IFS= read -rd '' spo

whateverbashに出力の前のNUL文字まで保存します$spo

または:

shopt -s lastpipe
whatever | readarray -t spo

出力をwhatever次に保存します。$spo 大量に(配列要素ごとに1行)

答え3

質問を正しく理解したら、stdoutを変数に渡したいと思います。少なくともそれが私が探していたものであり、最終的にここに来ました。だから私と同じ運命を共有している人のために:

spa=$(echo cart)

cart変数に割り当てられています$spa

答え4

これが問題に対する私の解決策です。

# assign will take last line of stdout and create an environment variable from it
# notes: a.) we avoid functions so that we can write to the current environment
#        b.) aliases don't take arguments, but we write this so that the "argument" appears
#            behind the alias, making it appear as though it is taking one, which in turn
#            becomes an actual argument into the temporary script T2.
# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"

関連情報