あなたの問題があることです。しかし、コマンド接頭辞を介して変数を設定するのは、bashではなくコマンドの環境にのみ影響します。したがって、old_val
はではないは文字列補間の目的で定義されています。 bash reference manualあたり(強調追加):
The environment for any simple command or function may be augmented temporarily by prefixing it with parameter assignments, as described in Shell Parameters. These assignment statements affect only the environment seen by that command.
sed
は、独自の環境からold_val
を読み取ろうとしましたのであれば、それは正しい値を見ることになります。しかし、sed
が受け取っているのは、bash補間がold_val
(それはsed
の場合のみ)を参照していないので、s//9/g
である補間後の文字列が渡されます。修正するには
は、別々のコマンドではなく、sed
接頭辞として割り当てを行うことで、bashで変数を設定します。
('cd /etc/squid/ && new_val=9 && old_val=3 && sed -i "s/$old_val/$new_val/g" *.conf')
以上正確に、あなたは本当に(それはへの容易な/危険だshell=True
に頼らないようにする必要があり悪用)。あなたがsed
を使用しなければならない場合でも、あなたがシェルを使用していたすべてのものは、Pythonの層で行うことができます。
import os
# Get the (unqualified) names of all the entries with the desired name
files = [f for f in os.listdir('/etc/squid') if f.endswith('.conf')]
# Run w/o shell=True, in list form, letting Python handle the working directory
# and variable formatting
subprocess.Popen(['sed', '-i', 's/{}/{}/g'.format(old_val, new_val)] + files, cwd='/etc/squid')
これは、同じ動作を持っている(/etc/squid
で動作し、あなたが勝ったように、修飾されていないファイル名を渡します深くネストされたディレクトリにたくさんのファイルがある場合、新しいコマンドラインの長さの問題があります)。
もちろん、the fileinput
moduleを使って、sed
の作業をPythonでも行えます。それはちょうどsed
のような場所にファイルを編集することを特徴とします(しかし、ファイルが意味のあるサイズであれば多少遅くなります)。
私はサブプロセスを使用することができますが、私はここで何が不足しているのか知りたいのです。 – user2939055
コマンドラインからうまく動作します。私はここでPythonが問題かもしれないと思う。 – miken32
@ miken32:これはPythonではなく、 'bash'の誤用です。これはコマンドラインからはうまく動作しません: 'new_val = 9 && old_val = 3 sed"/$ old_val/$ new_val/g "<(エコー" 1234567890 ")' – ShadowRanger