14.04版本疑问求解:source ~/.bashrc 如何在脚本内成功执行

sh/bash/dash/ksh/zsh等Shell脚本
回复
zcjinaction
帖子: 1
注册时间: 2016-04-09 20:13
系统: win7

14.04版本疑问求解:source ~/.bashrc 如何在脚本内成功执行

#1

帖子 zcjinaction » 2016-04-09 20:32

系统版本:Ubuntu14.04
操作:
$sudo -i
#su -l 普通用户 -c "ll"
报错信息:
-su: ll: 未找到命令
#su -l 普通用户 -c "source ~/.bashrc;ll"
报错信息:
-su: ll: 未找到命令

ll命令用普通用户登录肯定可以直接执行,大家都知道
问题来了:怎么在上面的操作方式成功执行ll命令。
头像
vickycq
帖子: 4507
注册时间: 2011-03-20 13:12
系统: Debian
来自: 山东省寿光县
联系:

Re: 14.04版本疑问求解:source ~/.bashrc 如何在脚本内成功执行

#2

帖子 vickycq » 2016-04-09 22:40

假设用户名为 zcjinaction
用户 zcjinaction 的 alias 定义在 /home/zcjinaction/.bashrc
/home/zcjinaction/.profile 中需要包含执行 /home/zcjinaction/.bashrc 的语句
如果 /home/zcjinaction/.profile 中不包含执行 /home/zcjinaction/.bashrc 的语句,那麽 用户 zcjinaction 的 alias 需要定义在 /home/zcjinaction/.profile 中

代码: 全选

sudo -iu zcjinaction alias ll | grep -o -P "(?<=\').*(?=')" | xargs sudo -iu zcjinaction
这里面有两个问题
1. su -c COMMAND 中,COMMAND 被传给 $SHELL 以 $SHELL -c COMMAND 的方式执行。但 bash -c 执行命令是以 non-login, non-interactive 方式进行的,此时 .bashrc 无效。(默认的 .bashrc 中已经包含 'If not running interactively, don't do anything' 的功能) 因此需要使用 bash -i 使之成为 interactive shell。

2. bash 只会检查命令的第一个字段是否为 alias。如执行 sudo ll,bash 只会检查 sudo 是否为 alias,而不会检查 ll。网传解决方法 alias sudo='sudo ' 只对 sudo ll 有效,对 sudo -u USER ll 无效,可能因为 ll 没有紧跟 sudo。对于 su 也是一样的。

参考
http://unix.stackexchange.com/questions ... ogin-shell
http://superuser.com/questions/874733/s ... ogin-shell
http://unix.stackexchange.com/questions ... sh-command
http://askubuntu.com/questions/22037/al ... using-sudo
http://serverfault.com/questions/61321/ ... rough-sudo
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户
回复