azl397985856 / fe-interview

宇宙最强的前端面试指南 (https://lucifer.ren/fe-interview)
Apache License 2.0
2.83k stars 260 forks source link

【每日一题】- 2020-08-06 - 讨厌的 Y #142

Closed azl397985856 closed 3 years ago

azl397985856 commented 4 years ago

我们用命令行按照一些东西的时候,有时候会让你按 y 确认。还有的是需要你输入一些东西。 比如: npm initvue cli , create-react-app

在实际的项目中,我也碰到了一个问题。 就是发布应用的时候,有时候可能需要用户选择一些信息,以决定如何发布。 比如:

很多时候这些提示是有必要的,但是有时候我们也会觉得这个没用,我们就全部用默认值就好了。

更糟糕的是,如何有阻塞需要用户输入的情况,我们就难以做自动化。

那么在这种情况,我们如何才能做自动化呢?

azl397985856 commented 4 years ago

交互式输入的原理

我们可以用 read 命令阻塞当前进程,请求标准输入。 当得到输入之后请求继续。

一个简单的例子:

#!/bin/bash

function confirm() {
    question="$1"
    read -n1 -p ${question} answer
    case ${answer} in
    Y | y) echo
        echo "Accepted";;
    N | n) echo
        echo "WA"
        exit;;
    esac
}
q="lucife.age<17"

confirm ${q}

采用类似的方法,我们可以获得不同类似的输入。 甚至可以让用户使用光标代替打字输入等。

如何自动化

知道了原理就好办了。但是仅仅知道上面的还不够,我们还需要知道一点,那就是标准输入时怎么一回事,以及我们可以模拟标准输入么?

我们知道管道实际上就是将前一个命令的标准输出定向到下一个的标准输入了。比如:

echo y | bash ./lucifer

其中 ./lucifer 就是上面我给的例子的脚步的磁盘地址。

可以看到,这次不再阻塞了,我们可以直接看到输出了Accepted。

扩展

有趣的是,有一个命令 yes 就是做这个事情的。 你一旦输入了 yes ,那么就会产生无数的 y。 上面的例子可以用 yes 改造:

yes | bash ./lucifer

效果是一样的。

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.