私は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
}
'(workonた)$エコーシェル端末からこれを実行して、パスを参照してください。 ) –
@JoranBeasley出力が空です。 – Mike
その場合、私は、その仕事がターミナルからアクセスできると信じていません... 'workon --help && echo $(which workon)' –