bash脚本中的su -c不会显示任何输出

时间:2013-01-13 11:02:30

标签: android bash su

我现在已经在这个问题上摸不着头脑了。看起来很简单,但我无法让它发挥作用。这是一个根植的Android平板电脑,如果这有所作为。我试图在正常的Linux系统上模仿sudo的行为。在bash脚本方面,我不是很有经验,所以这可能非常简单。这是一个两部分问题。

所以这是(一部分)名为别名的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某事时正在执行source命令。但是'&&'之后似乎没有做任何事情。甚至没有回音。甚至没有触摸随机文件名,所以它似乎不是stdout重定向或其他东西。我试过替换'&&'用'||'但这也不起作用。

调试时出现问题的第二部分。从shell调用以下内容:

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

...输出没有颜色的ls,即使别名文件是在调用ls之前立即获取的。现在我很困惑。

1 个答案:

答案 0 :(得分: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脚本而不是别名来封装命令通常会产生更强大和可移植的解决方案。