如何在php exec中为bash创建别名?

时间:2014-02-17 20:59:45

标签: php linux bash shell exec

我有这样的代码:

public function shell($code) {
    $code = preg_replace('/"/', '\\"', $code);
    exec('bash -c "' . $code . '"', $result);
    return $result;
}

我要添加alias ls="ls --color=always"。我试着将它放在我为项目目录中的shell创建的.bashrc文件中并使用:

exec('bash -c ". .bashrc;' . $code . '"', $result);

但是这不起作用,我在正确的目录中,因为我在调用ls -A时看到了该文件。

我还尝试使用文件和完整路径--init-file--rcfile

如何向该shell添加别名和函数?有可能吗?

2 个答案:

答案 0 :(得分:1)

无论如何,使用函数可能是更好的选择。但请注意可以使用别名 if you set the expand_aliases option

<?php
$code = 'ls';
$aliases = '
    shopt -s expand_aliases
    alias ls="ls -l"';
$code = $aliases . "\n" . $code;
exec('bash -c ' . escapeshellarg($code), $result);
echo implode("\n", $result) . "\n";

输出:

$ php aliasexec.php 
total 12
-rw-rw-rw- 1 mlk mlk 198 Feb 18 11:18 aliasexec.php

这是the man page所说的(强调我的):

  

如果shell不是交互式的,则不会扩展别名,除非   expand_aliases shell选项使用shopt [...]设置。

     

关于别名的定义和使用的规则有所不同   混乱。 Bash总是读取至少一个完整的输入行   在执行该行上的任何命令之前。别名是   读取命令时扩展,而不是执行时扩展。的因此,   别名定义与另一个命令出现在同一行   在读取下一行输入之前不会生效。 […] 至   安全,始终将别名定义放在单独的行,而不是   在复合命令中使用别名。

     

对于几乎所有目的,别名都被shell函数取代。

这就是为什么你必须使用换行符而不是;字符来定义别名。

答案 1 :(得分:0)

唯一有用的是添加函数而不是别名:

function ls() {
    /bin/ls --color=always $@;
}
function grep() {
    /bin/grep --color=always $@;
}
相关问题