当脚本读取命令时通过管道输出

Pas*_*cal 4 bash pipe

我有一个小脚本(称为 stc)来创建 SecureTokenstoken

#!/bin/bash

# Read Password
read -p "Password " -s PASS

TOKEN=$(stoken --stdin <<< "$PASS")
xclip -sel c <<< "$TOKEN"

if [[ ! -t 1 ]]; then
  echo $TOKEN
fi
Run Code Online (Sandbox Code Playgroud)

在正常情况下,它将令牌复制到剪贴板。当存在管道时,应将令牌写入stdout(这是有效的),但由于某种原因,管道中的下一个命令不会执行。我认为这与read但不知道如何解决这个问题有关。

例如

$ stc | tee
Run Code Online (Sandbox Code Playgroud)

结果是

$ stc | tee
Password <token echo>
<hangs forever>
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

xclip派生一个在后台运行的子进程来处理 CLIPBOARD 选择请求。在这里,该子进程将继承管道并将其保持打开状态,直到其他进程回收 CLIPBOARD 选择时退出。在这里,只需执行以下操作:

#! /bin/bash -
# Read Password
IFS= read -rsp "Password: " PASS

TOKEN=$(printf %s "$PASS" | stoken --stdin)
printf %s "$TOKEN" | xclip -sel c > /dev/null

[ -t 1 ] || printf '%s\n' "$TOKEN"
Run Code Online (Sandbox Code Playgroud)

(您还忘记了IFS=,-r选项read, 以及周围的引号$TOKEN,并且echo不能用于任意数据)。