web-dev-qa-db-ja.com

コマンド出力をkshの変数および標準出力にリダイレクトします

シェルコマンドがあります。出力を標準出力に書き込み、変数にも保存したいと思います。 1つのコマンドで解決したいと思います。私はこれらのことを試しました。

ls > $VAR          # redirects the output to file which name is stored in $VAR
ls | tee -a $VAR   # writes to standard output as well as in file which name is stored in $VAR
VAR=`ls`           # output into $VAR, but it is not sent to standard output
VAR=`ls`;echo $VAR # ok, it works but these are two commands

何か案が?

23
Attila Zobolyak

どうですか:

VAR=$(ls | tee /dev/tty)
57
Gary Barker

@Gary_Barkerからのすばらしい答えですが、これはすべてのシステムで可能というわけではありません。

チームシティには、char-consoleはありません。そして、別の小さな問題があります。

私が使用する場合

VAR=$(ls -1); echo $VAR

_ls -1_と同じではありません

私の解決策は、問題がなければ、出力がエラーパイプから来るということです。

VAR=$(ls -1 | tee >&2)

3
S.W.Joerns

私が理解したように、VAR=`ls`;echo $VARは問題ありませんが、2つのコマンドがあるので気に入らないでしょう。

@ Gary-Barkerが動作している間、すべてのシステムをチェックしているわけではありません。 Tシャツなどで問題が発生した場合は、常に独自に構築できます。

あなたがそれを知っているかどうかはわかりませんが、Linuxで使用できるプログラムの多くは、システム上の小さなバイナリを使用する単なるコードの集まりです。これは事実ですが、最終的な実行は実際には小さなものの集まりであるため、1つまたは2つのコンマンを使用する意味はありません。

したがって、実際の問題がターゲットで1つのコマンドしか書けない場合、/ sbinフォルダー内のshスクリプトを.sh拡張子なしで残すことにより、独自の「アプリ」を書くことができます(これらは./またはshプレフィックス。名前ではありません)

例としてそれを書きました:

#!/bin/bash if [ $1 ] then VAR=$*; echo $VAR fi

この例では、/ sbin/varrunファイルを作成しました。私は成功した(通常の)出力で次のコマンドを試してみました:

  • varrun ls
  • varrun uname
  • varrun uname -a

スペースを含むコマンドでは「引用符」を使用していないことに注意してください。

0
erm3nda