解析脚本的输出并仅在打印前处理最后一行
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
.
我有一个简单的 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
.