解析脚本的输出并仅在打印前处理最后一行

Parse the output of a script and process the last line only before printing

我有一个简单的 CLI 工具,要求输入主密码,并且仅当主密码正确时才打印字符串 $USER $PASSWORD

如何重现?

这是一个演示我的用例的脚本,真正的脚本实际上是一个我无法控制的CLI工具:

#!/usr/bin/env sh

printf "Enter master password: "
read -s password

echo

[ "$password" == "MasterPassword" ] && echo "user1 Passw0rd!"

用法示例:

$ ./my-cli-tool
Enter master password: ********
user1 Passw0rd!

问题

我不想在屏幕上打印密码 (Passw0rd!)。我只想打印用户 (user1),然后将密码 (Passw0rd!) 复制到剪贴板(比如 xclip -sel clipboard)。

我尝试了什么?

如果没有第一行 (Enter master password),我会这样做:

./my-cli-tool |
    while read -r USER PASSWORD
    do
        echo $USER
        echo -n $PASSWORD | xclip -sel clipboard
    done

但我的问题是我应该在提示时输入主密码,所以总是打印第一行。我试过 运行 ./my-cli-tool | tail -1: 没有显示提示,虽然如果我输入主密码,它只会打印 user1 Passw0rd!,所以我可以执行上面的命令将密码复制到剪贴板。

问题

你有什么想法:

预期输出

基本上,我想要那种输出:

$ ./my-cli-tool | solution
Enter master password: ********
user1

并将 Passw0rd! 复制到我的剪贴板中。

我只是稍微修改了你的答案 -

./my-cli-tool | {
    x=$(dd bs=1 count=1 2>/dev/null)
    while [ "$x" != : ]; do
        printf %c "$x";
        x=$(dd bs=1 count=1 2>/dev/null)
    done
    printf %s ": "
    while read -r USER PASSWORD
    do
        echo $USER
        echo -n $PASSWORD | xclip -sel clipboard
    done
}

让我知道它是否有效。

编辑: 更新逻辑。使用 dd.