簡単に保つために、次のことをしたいと思います。
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
末尾の改行なしで出力を変数に保存します)。spo
echo
いつでも次のことができます。
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
whatever
bash
に出力の前の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"