evalがコマンド置換で機能しないのはなぜですか? [閉鎖]

evalがコマンド置換で機能しないのはなぜですか? [閉鎖]

私はこのコマンドを持っています

$("${DIR}/test.py" "$1")

その出力は

export SOME_VAR="hello world"
export ANOTHER_VAR="hello"

しかし、eval $("${DIR}/test.py" "$1")

何も起こっていないようです。私は何が間違っていましたか?

これらの変数をシェルスクリプトにエクスポートしたいと思います。

完全なbashスクリプト:

#!/bin/bash     
DIR="$(cd `dirname $0` && pwd)" 
eval $("${DIR}/test.py" "$2") 
exit $? 

Pythonスクリプト(完全なスクリプトではありませんが、良いアイデアを提供します):

#!/usr/local/bin/python3 
print('export var1="{0}"\nexport var2="{1}"\nexport var3="{2}"\nexport var4="{2}"'.format(string1, string2, string3))

ベストアンサー1

与えられた例は私にも効果がありますが、潜在的な問題の原因があります。定義された値によっては、単語の区切りやワイルドカードの拡張を防ぐために、コマンドの置き換えの周りに二重引用符を使用する必要があります。

eval "$("${DIR}/test.py" "$1")"

少なくとも出力に改行で区切られた複数のコマンドが含まれている場合、二重引用符がないと問題が発生する可能性があります。二重引用符がない場合、出力は空白(通常はスペース、タブ、改行)に基づいて「単語」に分割され、次にスペースに連結されるためevalです。最終結果:すべての改行は空白に変換されるため、別々の行でなければならないすべてのコマンドが1つの長く混乱したコマンドに混在しています。

極端な例として、test.pyの出力が次のようになるとします。

# Define some variables:
export SOME_VAR="6 * 5"

分割 - 拡張 - マージプロセスは、次の結果コマンドを提供します。

# Define some variables: export SOME_VAR="6 file1.txt file2.txt otherfile.png 5"

(ここで、「file1.txt file2.txt otherfile.png」は現在のディレクトリ内のすべてのファイルです。)これはまったく望むものではありません。

おすすめ記事