我想编写一个shell脚本来自动执行一系列命令.问题是一些命令必须以超级用户身份运行,而某些命令绝不能以超级用户身份运行.到目前为止我所做的是这样的:
#!/bin/bash
command1
sudo command2
command3
sudo command4
问题是,这意味着有人必须等到command1完成才会提示输入密码,然后,如果command3需要足够长的时间,他们就必须等待command3完成.如果这个人可以站起来走开,然后一小时后回来并完成,那就太好了.例如,以下脚本有此问题:
#!/bin/bash
sleep 310
sudo echo "Hi, I'm root"
sleep 310
sudo echo "I'm still root?"
我怎样才能让用户在一开始就输入一次密码,然后走开?
更新:
谢谢你的回复.我在Mac OS X Lion上运行并运行了Stephen P的脚本并获得了不同的结果:(我还添加了$ HOME)
pair@abbey scratch$ ./test2.sh
uid is 501
user is pair
username is 
home directory is /Users/pair
pair@abbey scratch$ sudo ./test2.sh 
Password:
uid is 0
user is root
username is root
home directory is /Users/pair
我有一些昂贵的测试设置,仅对我的规范中的少数示例是必需的,并且如果有必要,它只需要运行一次。因为它很慢,我试图避免将它放在 before(:each) 块中,但 before(:all) 似乎不适合我的需要。我认为一个复杂的因素是昂贵的部分必须在其他一些常见设置之后运行。(这是一个带有搜索引擎的应用程序的水豚测试。创建一些记录后,我需要索引测试数据库以获得搜索结果。)我的设置是这样的:
feature 'some particular feature' do
  before(:each) do
    # a bunch of common test setup (creating records that this test will use)
  end
  describe 'simple example #1' do
    # a simple example that doesn't need the expensive setup
  end
  .
  .
  .
  describe 'simple example #N' do
    # a simple example that doesn't need the expensive setup
  end
  describe 'a more complicated example' do
    before(:all) do
      # expensive_setup that depends on the records created above
    end …发生了什么事情,每当我杀死一些文本时,它会被添加到kill-ring后面加一个额外的文本"".然后C-y只需插入"".所以问题是额外的""来自何处?
我跑emacs下tmux,我不能得到C-y(甚至M-x yank)插入从内容kill-ring.我确实Mark set在迷你缓冲器中看到,这是正常的行为yank; 我只是没有看到任何被猛拉的东西.我也看到每次击中时""都会添加.kill-ringC-y
我知道,C-y是越来越收到emacs通过查看输出M-x view-lossage,并且我知道,C-y势必会yank通过寻找与设定的按键C-h b.而且,M-x yank直接运行会得到完全相同的结果.
当我在外面重复实验时tmux,它按预期工作.对于它的价值,如果我重复了实验screen,而不是tmux,C-y按预期工作.
更多的细节是中tmux,我试图运行emacs与TERM=xterm-256color和TERM=screen-256color具有相同的结果.设置xterm-keys on或xterm-keys off在tmux似乎并不要么无所谓.我一直在关闭tmux …