如何在Bash脚本中自动按下回车键以响应提示?

9
我很了解这个问题已被回答多次,但我仍然无法弄清如何做到。也许是因为我不知道正确的关键词来搜索。
使用:
echo -ne '\n' | enter

不起作用。我的代码如下:
#! /bin/bash
#Grub-customizer
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
echo -ne '\n' | return
sudo apt-get update
sudo apt-get install grub-customizer

不要尝试。当你执行 echo | some_command 命令时,你可能会得到 echo 的退出状态或者 some_command 的退出状态,这取决于你的 shell 当前的配置方式。通过以一种不从标准输入读取任何内容的方式调用 some_command,你可以获得更加一致和可靠的结果。 - Charles Duffy
你所说的 enter 命令是什么?此外,return 命令基本上会忽略其标准输入,因此将某些内容通过管道传递给它并不能实现太多东西... - twalberg
2个回答

26

你需要将 \n 作为管道传递给接收它的命令(否则它永远看不到它!):

echo -ne '\n' | sudo add-apt-repository ppa:danielrichter2007/grub-customizer
echo -ne '\n' | sudo apt-get install grub-customizer

现在,这里正确的解决方案是改用-y标志:

sudo add-apt-repository -y ppa:danielrichter2007/grub-customizer
sudo apt-get install -y grub-customizer

2
管道可能有效,也可能无效——你知道apt-get和apt-add-repository是从stdin而不是/dev/tty读取的吗?更好的做法是更强烈地强调使用-y标志的建议,这是一个更加确定的方法。 - Charles Duffy
@CharlesDuffy 为这些添加了示例。然而,我认为大多数情况下apt会使用stdin,但是DEBIAN_FRONTEND肯定会破坏使用echo的情况。 - Thomas Orozco
4
尽管echo -ne '\n'是从问题描述中忠实地复制出来的,但惯用的写法只是echo - tripleee
1
我会将 -y 解决方案作为主要答案发布,而 echo 修复方法则作为旁注评论。 - tripleee

1
'echo -ne "\n" | ./create.sh \n', // this command is for pressing enter each time the shell script is asking user to press enter
'echo -ne "\n" | yourcommand \n', //tempate 

  const client = new Client();
  const cmds = [
    'ls -lah \n', // \n is important 
    'cd /mnt \n',
    'echo -ne "\n" | ./create.sh \n', // this command is for pressing enter each time the shell script is asking user to press enter
    'pwd \n',
    'ls -lah \n',
    'exit \n',
  ];
  client.on('ready', () => {
      console.log('Client :: ready');
      client.shell((err, stream) => {
        stream.on('close', (code) => {
          console.log('stream :: close\n', { code });
        }).on('data', (myData) => {
          console.log('stream :: data\n', myData.toString());
        }).on('exit', (code) => {
          console.log('stream :: exit\n', { code });
          client.end();
        }).on('error', (e) => {
          console.log('stream :: error\n', { e });
          rej(e);
        });
        for (let i = 0; i < cmds.length; i += 1) {
          const cmd = cmds[i];
          stream.write(`${cmd}`);
        }
      });
    }).connect({
    host: '127.0.0.1',
    port: 22,
    username: 'root',
    password: 'root',
  });

Reference Click HERE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接