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


19

簡単にするために、次のことを行います。

echo cart | assign spo;
echo $spo  

出力:カート

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

置換を使用してこれを行うすべての方法を認識しています。


なぜ代替せずにこれを行うのですか?
タナトス

パイプのみで書くときの逆ポーランド記法の流れが好きです。私ははるかに速いコーディングであり、コードの品質/速度はそれほど重要ではありません。また、チェインするときに、ティックなどを消去するのではなく、チェインの一部をコメントアウトして現在の出力をエコーする方が簡単です
。– MageProspero

デバッグの容易さが心配な場合は、一連の個別の行にbackticksコマンドを配置することを検討してください。A=$( some | command | here )それぞれの持つsome |command |here独自の行に。
ロアイマ

回答:


11
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最初のNUL文字までの出力を保存するには(bash変数はNUL文字を保存できません)$spo

または:

shopt -s lastpipe
whatever | readarray -t spo

出力を格納するためwhatever$spo アレイ(配列要素ごとに1つのライン)。


1
IFS=との間にスペースがあってはいけませんreadか?
caesarsol

すべてが最後のパイプにあられ。最後のパイプはジョブ制御がアクティブな状態では機能しないため、コマンドラインからサイドノートセット+ m(ermmmまたは-m)が必要になります。
MageProspero

17

以下を使用すると、このようなことができますbash

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

残念ながら、変数 "spo"はwhile-d-doneループの外側には存在しません。whileループ内で必要な処理を実行できれば、それは機能します。

上記で書いた内容を、ATT ksh(pdkshまたはmkshではなく)またはすばらしいzshでほぼ正確に実行できます。

% echo cart | read spo
% echo $spo
cart

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


1
あなたは、Kornシェル(例えばにcoprocessesを使用することができますmksh): echo cart |& while read -p spo; do echo $spo; done(実際にはより良い使用にwhile IFS= read -p -r spo; do…かかわらず)
mirabilos

2

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

spa=$(echo cart)

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


2
それは彼らが代用と呼んでいるもので、OPはそれを避けたかったのです。
ドミトリーグリゴリエフ

これは私にとって便利でした。変数に代入するだけでいいのです。
クリスマリシック

1

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

echo cart | cat 

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

echo cart | tee /dev/tty | xargs ls

エイリアスを使用してコマンドを短縮できます。

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

なぜ出力をプレーンにパイプしたいのcatですか?
ロアイマ

1
@roaima一部のコマンドは、端末で実行されていることを認識し、パイプに出力する場合とは異なる動作をします。特に、現在の画面幅に合わせて行を切り捨てる場合があります。ほとんどのコマンドでは、catコマンドは冗長です。
BillThor

ああ、今あなたが説明しようとしていたことがわかりました。echo | catコンストラクトは私を投げました。
ロアイマ

1

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

# 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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.