source
コマンドの説明があります。
source
現在のシェルから引数として渡されたファイルの内容を実行するbashシェル組み込みコマンド。同義語.
(ピリオド)があります。
たとえば、実験のために私の場合は、他のシェルから変数をエクスポートしたいと思いますzsh
( でコマンドを実行bash
)。
$ zsh -c "export test=$(echo "hello world")"
$ echo $test
$
zsh
コマンドは.dllファイルから直接実行されず、サブシェルで実行されるため機能しませんbash
。
このようにスクリプトを作成してインポートすると、
#!/home/linuxbrew/.linuxbrew/bin/zsh
export test=$(echo "hello world")
$ chmod 777 test.zsh
$ source test.zsh
$ echo $test
hello world
うまくいきます。
問題は、ファイルを介してのみコマンドを実行できるsource
ため、スクリプトを使用せずにコマンドを実行する方法です。source
私は次のことを達成したいと思います:
source zsh -c "export test=$(echo "hello world")"
これが不可能な場合は、その理由を説明してください。
ベストアンサー1
あなたの質問に対する答えは次のとおりです。eval
。
eval "export test=$(echo "hello world")"
パラメータはeval
シェルコードの一部として実行されます。きちんとするのが難しい場合が多いです。たとえば、上記のコードは11文字の文字列ではなくtest
5文字の文字列を設定します。これはに設定されている元の例を模倣します。これは、どちらの場合もシェルがコードを実行し、引数を使用してコマンドを呼び出していると判断するためです。ある場合は、コマンドが最初の引数を持つ外部プログラムであり、別の場合にはコマンドが組み込みプログラムです。hello
hello world
zsh -c "export test=$(echo "hello world")"
test
hello
export test=hello world
zsh
-c
eval
test
に設定するには、またはまたはhello world
同じ入力を取得するために内部シェル評価を準備する必要があります。値の任意の文字に対して機能する直接的な方法はありません。文字列に一重引用符が含まれている場合、一重引用符で囲むことは失敗します。文字列に次のいずれかが含まれていると失敗します。改行文字で作業しないでください。この問題を解決する方法は、実行する操作によって異なります。多くの回答は以下にあります。export test="hello world"
export test='hello world'
export test=hello\ world
`"\[
引用するこのサイトに質問をしてください。
しかし、これはあなたが望むものではないかもしれません。あなたが本当にやりたいことが何であるかは不明です。コードは同じシェルによって実行されます。これがsource
ORのすべてですeval
。同じプログラム内でコードを実行することです。 shebangで始まるファイルを読み取る例を示していますが、source
shebang行は無視されます。文書未実行:その内容のみが実行されます。
別のシェル(bashなど)を使用して変数値を設定しているときに1つのプログラム(zshなど)を使用する場合は、すべてを忘れて別のプログラムに値を印刷してください。簡単な方法は次のとおりです。
test=$(zsh -c 'echo "hello world"')
コマンドの置き換えは末尾の改行を削除することに注意してください。したがって、値は最後に改行のないtest
11文字の文字列になります。末尾の改行を含む完全な出力をhello world
取得するには、echo
最後に別の文字(およびオプションの改行)を追加してから削除します。
test=$(zsh -c 'echo "hello world"'; echo .); test=${test%.}