Linux .profile会覆盖其他bash命令

时间:2016-09-12 16:40:19

标签: linux bash shell

当root用户登录到他们的Linux服务器时,我正在加载脚本(whiptail),这很好。问题是,现在,当我尝试从命令提示符(或crontab)运行其他脚本时,将加载初始脚本,看起来我想要运行的脚本不是。

这就是~/.profile的样子:

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n
source /root/menu.sh

因此,当我尝试运行bash -lc 'ruby some/other/script.rb时,我会进入~/.profile末尾运行的脚本menu.sh。我该如何防止这种情况发生?

这是我从长远来看需要做的事情:

  1. 服务器启动并将用户带到/root/menu.sh
  2. 有通过crontab运行的后台脚本,例如签入脚本,作业脚本等。

1 个答案:

答案 0 :(得分:1)

最佳实践:除非您需要一个

,否则不要使用登录shell

当你将-l参数传递给bash时,你会告诉它表现为登录shell;这包括运行用户的.profile

如果您不想要这种行为,请不要传递-l。因此:

bash -c 'ruby some/other/script.rb'

那就是说,直接调用ruby而没有任何封闭的shell就没有优势:

ruby some/other/script.rb

如果必须使用登录shell ...

如果您想要运行用户的.profile的其他效果,您可以设置一个环境变量来表示您想要绕过此行为:

# in the user's login scripts
[ -n "$skip_menu" ] || source /root/menu.sh

......然后......

skip_menu=1 bash -lc '...your command here...'

......或者,如果没有封闭的外壳执行......

env skip_menu=1 bash -lc '...your command here...'