【问题标题】:How to create alias for bash inside php exec?如何在 php exec 中为 bash 创建别名?
【发布时间】:2014-03-17 08:15:49
【问题描述】:

我有这样的代码:

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 添加别名和函数?有可能吗?

【问题讨论】:

    标签: php linux bash shell exec


    【解决方案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 函数所取代。

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

    【讨论】:

    • 比我的解决方案更好,因为它实际上解决了问题。我尝试过同样的事情,但我将shopt 放入一个文件中,并使用分号而不是换行符。
    • @jcubic 是的,alias 的工作方式很奇怪,这就是功能更好的原因。我添加了一个解释为什么你必须使用换行符而不是分号。
    【解决方案2】:

    唯一可行的方法是添加函数而不是别名:

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

    【讨论】:

    • 有时间查看shellcheck.net。它有助于发现 sh/bash 代码中的错误。
    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多