5

リモートサーバーでいくつかのコマンドを実行しようとしています。そこにいくつかのbashファイルを調達する必要があります。残念ながら、fabric は (突然、最近?) を使用し始め/bin/shたようで、スクリプトで bash 構文を使用しているため、機能しなくなりました。私はこれを見つけまし

shell が True (デフォルト) の場合、run はシェル インタープリターを介して指定されたコマンド文字列を実行します。シェル インタープリターの値は、env.shell を設定することで制御できます (デフォルトは /bin/bash -l -c "". ) shell が True の場合、コマンド内の二重引用符 (") またはドル記号 ($) 文字は自動的にエスケープされます。

env.shell を変更していないので、fabric が を使い始めた理由がわかりませんsh。いずれにせよ、私はそれを上書きしていますが、それでもうまくいきません:

env.shell = "/bin/bash"

何が原因でしょうか? ファブリックを強制的に使用するにはどうすればよいbashですか?

4

1 に答える 1

5

かなり掘り下げましたが、これが私が見つけたものです:

舞台裏でファブリックが何をしているかを見ることができます:

from   fabric.api                                        import output

FAB_SHOW_RUNNING  = True   # Show the command that fabric runs
FAB_SHOW_STDOUT   = False  # Show the stdout of the command run
FAB_SHOW_STDERR   = False  # Show the stderr of the command run
FAB_SHOW_DEBUG    = True   # Increase logging detail for messages
FAB_SHOW_USER     = True
FAB_SHOW_STATUS   = False  # Prevent fabric from using print in some situations (at least in disconnect_all)
FAB_SHOW_WARNINGS = False  # Avoid fabric from showing messages about failed commands

output['running']  = FAB_SHOW_RUNNING
output['stdout']   = FAB_SHOW_STDOUT
output['stderr']   = FAB_SHOW_STDERR
output['debug']    = FAB_SHOW_DEBUG
output['user']     = FAB_SHOW_USER
output['status']   = FAB_SHOW_STATUS
output['warnings'] = FAB_SHOW_WARNINGS

ファブリックを使用していないことが判明しました/bin/shが、(この特定のケースでは)ローカルコマンドを実行していたため、原因はサブプロセスモジュールでした。使用するシェルを指定するには、次のように指定する必要がありますshell=Trueexecutable='/bin/bash'

于 2013-06-06T13:21:19.370 に答える