2017-03-02 3 views
1

私はCLIからPHPスクリプトを実行しています。そのPHPスクリプトでは、コマンドラインからいくつかのコマンドをsystem()を使って実行したいと思います。おそらくこれは仕事のための適切なツールではないでしょうし、おそらくシェルスクリプトでPHPスクリプトをラップすることもできますが、PHPスクリプト内で完全に実行できるかどうかを知りたいと思っています。PHP execから "workon"というpythonコマンドをどのように呼び出すのですか?

私はそれが正常に動作し、端末で次の操作を行います。

[email protected]:~$ workon pootle 
(pootle)[email protected]:~$ 

しかし、これはPHP(同じユーザーとして実行される)から動作しません。

#!/usr/bin/env php 
<?php 
system('workon pootle'); // sh: 1: workon: not found 
system('/bin/bash workon pootle'); // /bin/bash: workon: No such file or directory 
system('/bin/sh workon pootle'); // /bin/sh: 0: Can't open workon 

最後の2つの出力は、端末で実行しているときとまったく同じですが、最初のものは異なっています。私はエイリアスかもしれないと思ったが、そうではないようだ。 alias | grep -i workonには出力がありません。

私は、コマンドラインenvとPHP system('env')から返された環境変数のすべてを比較し、_すべてがSHELL=/bin/bash含めて、まったく同じです。

端末によって実行されるwhich workonの出力は空です。

編集

たぶん私はこれをどこかに取得しています。

[email protected]:~$ type workon 
workon is a function 
workon() 
{ 
    typeset env_name="$1"; 
    if [ "$env_name" = "" ]; then 
     lsvirtualenv -b; 
     return 1; 
    fi; 
    virtualenvwrapper_verify_workon_home || return 1; 
    virtualenvwrapper_verify_workon_environment $env_name || return 1; 
    activate="$WORKON_HOME/$env_name/$VIRTUALENVWRAPPER_ENV_BIN_DIR/activate"; 
    if [ ! -f "$activate" ]; then 
     echo "ERROR: Environment '$WORKON_HOME/$env_name' does not contain an activate script." 1>&2; 
     return 1; 
    fi; 
    type deactivate > /dev/null 2>&1; 
    if [ $? -eq 0 ]; then 
     deactivate; 
     unset -f deactivate > /dev/null 2>&1; 
    fi; 
    virtualenvwrapper_run_hook "pre_activate" "$env_name"; 
    source "$activate"; 
    virtualenvwrapper_original_deactivate=`typeset -f deactivate | sed 's/deactivate/virtualenv_deactivate/g'`; 
    eval "$virtualenvwrapper_original_deactivate"; 
    unset -f deactivate > /dev/null 2>&1; 
    eval 'deactivate() { 

     # Call the local hook before the global so we can undo 
     # any settings made by the local postactivate first. 
     virtualenvwrapper_run_hook "pre_deactivate" 

     env_postdeactivate_hook="$VIRTUAL_ENV/$VIRTUALENVWRAPPER_ENV_BIN_DIR/postdeactivate" 
     old_env=$(basename "$VIRTUAL_ENV") 

     # Call the original function. 
     virtualenv_deactivate $1 

     virtualenvwrapper_run_hook "post_deactivate" "$old_env" 

     if [ ! "$1" = "nondestructive" ] 
     then 
      # Remove this function 
      unset -f virtualenv_deactivate >/dev/null 2>&1 
      unset -f deactivate >/dev/null 2>&1 
     fi 

    }'; 
    virtualenvwrapper_run_hook "post_activate"; 
    return 0 
} 
+0

'(workonた)$エコーシェル端末からこれを実行して、パスを参照してください。 ) –

+0

@JoranBeasley出力が空です。 – Mike

+1

その場合、私は、その仕事がターミナルからアクセスできると信じていません... 'workon --help && echo $(which workon)' –

答えて

0

から把握しますvirtualenvwrapper関数を実行するには、最初にsourcevirtualenvwrapper.shファイルが必要です。そのファイルの場所を見つけるには、ターミナルで実行します。

which virtualenvwrapper.sh 

をそれは、任意の出力を生成し、それを見つけるためにfindを使用しない場合。私にとって

find /usr/ -name "virtualenvwrapper.sh" 

、場所は/usr/local/bin/virtualenvwrapper.sh

はPHPがシステムコールをした場合、それはshを使用した:

<?php 
system('echo $0'); // echoes 'sh' 

しかしvirtualenvwrapper.shスクリプトがshで実行されたときに失敗したので、私たちのようにする必要があり代わりにbashを使用してください。注意すべき

もう一つは、PHPのシステムコールは、互いに別々のサブシェルであるということですので、あなたがしなければ:

<?php 
system('FOO=BAR'); 
system('echo $FOO'); 

これは、空行を出力します。次のプリントBARとしてどこ:virtualenvwrapper.sh

  • は、仮想環境
  • 作業変更する workonを実行し

    • 代わりにSHの使用bashの
    • 出典:

      <?php 
      system('FOO=BAR && echo $FOO'); 
      

      したがって、我々は次の必要

    • その他のコマンドを実行する
    • これをすべて実行する1つのライン

    にこれは私が思いついたものですし、正しく動作するように表示されます( `

    <?php 
    $commands = [ 
        'source /usr/local/bin/virtualenvwrapper.sh', 
        'workon pootle', 
        'pootle update_stores --project=AIWeb', 
    ]; 
    
    system('/bin/bash -c "'.implode(' && ', $commands) .'"'); 
    
    0

    bash /usr/share/virtualenvwrapper/virtualenvwrapper.sh workon

    私はvirtualenvwrapperをインストールすることでこれを見つけた後、私は

    env | grep VIRTU 
    VIRTUALENVWRAPPER_PROJECT_FILENAME=.project 
    VIRTUALENVWRAPPER_SCRIPT=/usr/share/virtualenvwrapper/virtualenvwrapper.sh 
    VIRTUALENVWRAPPER_HOOK_DIR=/root/.virtualenvs 
    _VIRTUALENVWRAPPER_API= mkvirtualenv rmvirtualenv lsvirtualenv showvirtualenv workon add2virtualenv cdsitepackages cdvirtualenv lssitepackages toggleglobalsitepackages cpvirtualenv setvirtualenvproject mkproject cdproject mktmpenv 
    

    を走り、VIRTUALENVWRAPPER_SCRIPTを見た...非常に簡単にできるようにするために存在し

    +0

    私は 'VIRTUALENVWRAPPER_SCRIPT'環境変数を持っていませんが、'/usr/local/bin/virtualenvwrapper.sh'を見つけました。 '/ bin/bash /usr/local/bin/virtualenvwrapper.sh workon pootle'を実行しても出力はありません。 – Mike

    関連する問題