452

特定のシェルでは、通常、1つまたは複数の変数を設定してから、コマンドを実行します。最近、コマンドの前に変数定義を追加する概念について学びました。

FOO=bar somecommand someargs

これはうまくいきます...ちょっと。LC_ *変数を変更する場合(コマンドには影響するようですが、引数には影響しません。たとえば、'[az]' char範囲)、または出力を別のコマンドにパイプする場合は機能しません。

FOO=bar somecommand someargs | somecommand2  # somecommand2 is unaware of FOO

somecommand2の前に"FOO= bar"を追加することもできます。これは機能しますが、不要な重複が追加され、変数に応じて解釈される引数(たとえば、'[az]')には役立ちません。

それで、これを単一の行で行うための良い方法は何ですか?

私は次のオーダーで何かを考えています:

FOO=bar (somecommand someargs | somecommand2)  # Doesn't actually work

良い答えがたくさんありました!目標は、できれば「エクスポート」を使用せずに、これをワンライナーに保つことです。Bashの呼び出しを使用する方法は全体的に最適でしたが、「エクスポート」が含まれる括弧付きのバージョンはもう少しコンパクトでした。パイプではなくリダイレ​​クトを使用する方法も興味深いものです。

4

6 に答える 6

408
FOO=bar bash -c 'somecommand someargs | somecommand2'
于 2012-06-01T19:39:08.603 に答える
269

変数をエクスポートするのはどうですか?ただし、サブシェル内のみですか?:

(export FOO=bar && somecommand someargs | somecommand2)

キースには、コマンドを無条件に実行するためのポイントがあります。これを実行します。

(export FOO=bar; somecommand someargs | somecommand2)
于 2012-06-01T19:25:04.350 に答える
57

また、使用することができますeval

FOO=bar eval 'somecommand someargs | somecommand2'

この回答はすべての人を満足させるものでevalはないようですので、何かを明確にしましょう。一重引用符を使用して、記述どおりに使用すると、完全に安全です。(受け入れられた回答のように)外部プロセスを起動せず、(他の回答のように)追加のサブシェルでコマンドを実行しないので、これは良いことです。

いくつかの定期的な見解を得るので、それの代わりにすべての人を喜ばせ、この迅速な「トリック」evalのすべての利点(そしておそらくそれ以上!)を与えるのはおそらく良いことです。eval関数を使うだけ!すべてのコマンドで関数を定義します。

mypipe() {
    somecommand someargs | somecommand2
}

次のような環境変数を使用して実行します。

FOO=bar mypipe
于 2015-12-05T07:39:59.563 に答える
36

を使用しenvます。

たとえば、env FOO=BAR commandcommand実行が終了すると、環境変数が再び復元/変更されないことに注意してください。

シェル置換が発生することに注意してください。つまり、同じコマンドラインで明示的に参照する場合は、シェルインタープリターが実行$FOO置換を実行しないようにエスケープする必要があります。env

$ export FOO=BAR
$ env FOO=FUBAR bash -c 'echo $FOO'
FUBAR
$ echo $FOO
BAR
于 2019-06-26T04:19:30.973 に答える
20

簡単なアプローチは、;

例えば:

ENV=prod; ansible-playbook -i inventories/$ENV --extra-vars "env=$ENV"  deauthorize_users.yml --check

command1; command2command1を実行した後、command2を順次実行します。コマンドが成功したかどうかは関係ありません。

于 2020-06-20T07:50:51.187 に答える
-5

シェルスクリプトを使用します。

#!/bin/bash
# myscript
FOO=bar
somecommand someargs | somecommand2

> ./myscript
于 2012-06-01T19:40:13.293 に答える