ファイルの代わりにシェルコードをどのように取得できますか?

ファイルの代わりにシェルコードをどのように取得できますか?

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文字の文字列ではなくtest5文字の文字列を設定します。これはに設定されている元の例を模倣します。これは、どちらの場合もシェルがコードを実行し、引数を使用してコマンドを呼び出していると判断するためです。ある場合は、コマンドが最初の引数を持つ外部プログラムであり、別の場合にはコマンドが組み込みプログラムです。hellohello worldzsh -c "export test=$(echo "hello world")"testhelloexport test=hello worldzsh-ceval

testに設定するには、またはまたはhello world同じ入力を取得するために内部シェル評価を準備する必要があります。値の任意の文字に対して機能する直接的な方法はありません。文字列に一重引用符が含まれている場合、一重引用符で囲むことは失敗します。文字列に次のいずれかが含まれていると失敗します。改行文字で作業しないでください。この問題を解決する方法は、実行する操作によって異なります。多くの回答は以下にあります。export test="hello world"export test='hello world'export test=hello\ world`"\[このサイトに質問をしてください。

しかし、これはあなたが望むものではないかもしれません。あなたが本当にやりたいことが何であるかは不明です。コードは同じシェルによって実行されます。これがsourceORのすべてですeval。同じプログラム内でコードを実行することです。 shebangで始まるファイルを読み取る例を示していますが、sourceshebang行は無視されます。文書未実行:その内容のみが実行されます。

別のシェル(bashなど)を使用して変数値を設定しているときに1つのプログラム(zshなど)を使用する場合は、すべてを忘れて別のプログラムに値を印刷してください。簡単な方法は次のとおりです。

test=$(zsh -c 'echo "hello world"')

コマンドの置き換えは末尾の改行を削除することに注意してください。したがって、値は最後に改行のないtest11文字の文字列になります。末尾の改行を含む完全な出力をhello world取得するには、echo最後に別の文字(およびオプションの改行)を追加してから削除します。

test=$(zsh -c 'echo "hello world"'; echo .); test=${test%.}

おすすめ記事