簡単にするために、私はしたいと思います:
echo cart | assign spo;
echo $spo
出力:カート
そのようなassign
アプリケーションは存在しますか?
置換を使用してこれを行う方法はすべて知っています。
echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }
echo
が1行しか出力しない限り、機能します(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
の出力を最初のNUL文字まで格納するには(bash
変数はNUL文字を格納できません)、$spo
に格納します。
または:
shopt -s lastpipe
whatever | readarray -t spo
whatever
の出力を$spo
arrayに格納するには(配列要素ごとに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を使用することです。
私が問題を正しく理解している場合は、stdoutを変数にパイプする必要があります。少なくともそれが私が探していたものであり、ここで終わりました。だから私の運命を共有する人のために:
spa=$(echo cart)
cart
を変数$spa
に割り当てます。
これが私の問題の解決策です。
# 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"
現在のパイプストリームを出力するだけの場合は、cat
を使用します。
echo cart | cat
コマンドチェーンを続行する場合は、tee
コマンドを使用して出力をエコーしてください。
echo cart | tee /dev/tty | xargs ls
エイリアスを使用してコマンドを短くすることができます。
alias tout='tee /dev/tty'
echo cart | tout | xargs ls