web-dev-qa-db-ja.com

パイプは変数を割り当てます

簡単にするために、私はしたいと思います:

echo cart | assign spo;
echo $spo  

出力:カート

そのようなassignアプリケーションは存在しますか?

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

20
MageProspero
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の出力を$spoarrayに格納するには(配列要素ごとに1行)。

12

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を使用することです。

17
Bruce Ediger

私が問題を正しく理解している場合は、stdoutを変数にパイプする必要があります。少なくともそれが私が探していたものであり、ここで終わりました。だから私の運命を共有する人のために:

spa=$(echo cart)

cartを変数$spaに割り当てます。

3
zack-vii

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

# 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"
1
Brian Kramer

現在のパイプストリームを出力するだけの場合は、catを使用します。

echo cart | cat 

コマンドチェーンを続行する場合は、teeコマンドを使用して出力をエコーし​​てください。

echo cart | tee /dev/tty | xargs ls

エイリアスを使用してコマンドを短くすることができます。

alias tout='tee /dev/tty'
echo cart | tout | xargs ls
1
BillThor