0

私は、ini ファイル (スクリプトと一緒に開発してきたフォーマット) を取り、ファイルを読み込んで、指定されたアクションを実行する bash スクリプトを作成しました。

ini 形式の関数の 1 つを使用すると、シェル コマンドを渡して実行できますeval。コマンドに変数名が含まれていると、問題が発生します。

eval(または一般的なシェル)は値を正しく置換していないようで、ほとんどの場合、すべての変数名を空白に置き換えてコマンドを壊しているようです。文字列出力を作成するサブシェルにも同じ問題があるようです。

奇妙な点は、これが私の開発マシン (Linux Mint 13 を実行) で機能したことですが、CentOS 5.8 を実行しているターゲット マシンにスクリプトを移動すると、これらの問題が発生しました。

ini ファイルから読み取ったコードの例:

shellcmd $toolspath/program > /path/file

shellcmd parsedata=$( cat /path/file )

shellcmdこれらは、先頭を取り除き、次を使用して文字列を評価するスクリプト関数を通過します

eval ${scmd}

奇妙な動作を引き起こしている可能性のあるものと、問題を解決するために私ができることについてのアイデアはありますか? ここでの私の最終的な目標は、ファイルから行を読み取ってスクリプトを実行し、読み取りコマンドからスクリプト変数を正しく処理できるようにすることです。

4

2 に答える 2

0

Bash 3.2.25 (CentOS 5) を使用してこれを試してみましたが、正常に動作します。

toolspath='/bin'
while read prefix scmd
do
    if [[ $prefix == 'shellcmd' ]]
    then
        echo "Evaluating: <$scmd>"
        eval ${scmd}
    else
        echo "$prefix ignored"
    fi
done < ini

と:

shellcmd $toolspath/ls > /home/user1/file     
shellcmd parsedata=$( cat /home/user1/file )
shellcmd echo $parsedata

明らかにパスを設定する必要がありました。ほとんどの場合、マシンを切り替えたときにパスを変更する必要がありました。パスにスペースが埋め込まれていますか?

どのようにファイルを転送しましたか? Windows経由で行った可能性がありますか?気まぐれにunix2dosファイルiniを実行したところ、あなたが説明したのと同様の症状が発生しました。それが私の最善の推測です。

于 2012-09-14T11:55:15.033 に答える
0

この問題の原因となっている 1 つのコマンドの適切な代替手段を見つけたので、この質問を解決済みとしてマークします。

調査の結果、bash シェルに不明なバグが発見されたようです。私が評価しようとしていた特定のコマンドは、その出力で端末コードを返しました。シェルがファイルからリダイレクトされた入力で読み取りループにあったため、奇妙な動作が発生しました。私の解決策は、この特定のコマンドへの呼び出しを読み取りループの外に移動することでした。それはまだ根本的な問題を解決していません。これは bash シェルのバグであると私は信じています。これが、同じ(あいまいな)問題に遭遇した他の誰かに役立つことを願っています。

于 2012-09-15T00:24:48.693 に答える