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



我有一个简单的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.

最新更新