我现在已经在这个问题上摸不着头脑了。看起来很简单,但我无法让它发挥作用。这是一个根植的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之前立即获取的。现在我很困惑。
答案 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脚本而不是别名来封装命令通常会产生更强大和可移植的解决方案。