web-dev-qa-db-ja.com

grashコマンドの出力をbashスクリプトの変数に保存する

grive ツールを使用して、コンピューターをGoogleドライブと同期するスクリプトを作成しようとしています。 griveコマンドの出力をbash変数に保存したいのですが、うまくいかないようです。

一部のグーグルは、次の構文を使用してコマンド出力を変数に保存できることを教えてくれました。

VARABLENAME=$(command)

出力は後で印刷できます

echo ${VARIABLENAME}

ただし、この構文を使用すると、ターミナルで出力が印刷され、変数の内容が空になるため、griveコマンドはこれの例外のようです。

griveの出力を変数に適切に格納するにはどうすればよいですか?

4

問題は、griveコマンドがエラーストリームSTDERR(ファイル記述子2)に出力していたことです。これは通常、エラーメッセージの受け渡しに使用され、STDOUT(ファイル記述子1)は実際の(成功時)出力の表示に使用されますすべてのプログラムの(厳密に言えば)。

griveは使用していませんが、あなたの言葉によると、開発者はコマンドからのメッセージを表示するためだけにSTDERRを使用した可能性があります。

これで、使用したコマンド置換:

VARABLENAME=$(command)

sTDERRではなく、commandのSTDOUTをVARABLENAMEに保存します。その結果、変数は空であり、ターミナルにメッセージが表示されていました。

私は提案しています:

VARABLENAME="$(command 2>&1)"

これにより、STDOUTとSTDERRの両方が変数に保存されます(この場合、STDOUTがないのでSTDERRのみです)。したがって、echo "${VARIABLENAME}"を使用すると、目的の結果が得られます。

また、STDOUTがないため、STDERRのみを変数に保存できます(一般化、そのようなプログラムの場合はtrue):

VARABLENAME="$(command 2>&1 >/dev/null)"
8
heemayl