-1

一段时间以来,我一直在为这个问题挠头。它看起来很简单,但我就是无法让它工作。这是在一个有根的 android 平板电脑上,如果这有所作为的话。我试图模仿 sudo 在普通 linux 系统上的行为。在 bash 脚本方面我不是很有经验,所以这可能很简单。这是一个两部分的问题。

所以这里(部分)是一个名为 aliases 的 bash 脚本。它通常由 bashrc 提供。问题是我希望我的自定义 sudo 命令能够访问此脚本中定义的别名。

#! /system/xbin/bash

alias ls='busybox ls --color=auto'

function sudo() {
    su -c 'source /system/etc/bash/aliases && "$@"'
} 

因此,当我从 shell 调用 sudo 时,它绝对不会输出任何内容。上面脚本末尾的快速“echo ok”证明当我尝试 sudo 某些东西时正在执行源命令。但是在'&&'之后似乎什么也没做。甚至没有回声。甚至没有触及随机文件名的工作,所以它似乎不是标准输出被重定向或什么的。我试过用 '||' 代替 '&&' 但这也不起作用。

调试时出现了问题的第二部分。从 shell 调用以下命令:

su -c 'source /system/etc/bash/aliases && ls'

... ls 输出没有颜色,即使别名文件是在调用 ls 之前立即获取的。现在我彻底糊涂了。

4

1 回答 1

3

您的直接问题是您已将命令括在单引号中:

su -c 'source /system/etc/bash/aliases && "$@"'

单引号表示在函数"$@"内部没有展开,所以你正在运行文字命令......

source /system/etc/bash/aliases && "$@"

...并且"$@"扩展为空字符串。如果您无需处理引用的参数就可以生活,您可以这样做:

    su -c "source /system/etc/bash/aliases && $*"

请注意使用双引号 ( "...") 而不是单引号。但是,这可能仍然无法满足您的需要,因为:

当 shell 不是交互式时,别名不会展开,除非 expand_aliases shell 选项使用 shopt 设置(参见下面 SHELL BUILTIN COMMANDS 下的 shopt 描述)。

一般来说,我尽量避免在 shell 脚本中使用别名,因为它使脚本严重依赖于您的环境(或者在这种情况下,是目标用户的环境)。使用 shell 脚本而不是别名来封装命令通常会产生更健壮和可移植的解决方案。

于 2013-01-13T13:55:15.203 回答