我有这样的代码:
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添加别名和函数?有可能吗?
答案 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 $@;
}