スクリプトがコマンドを読み取るときのパイプ出力

スクリプトがコマンドを読み取るときのパイプ出力

SecureTokenを生成する小さなスクリプト(stcと呼ばれる)があります。stoken

#!/bin/bash

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

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

if [[ ! -t 1 ]]; then
  echo $TOKEN
fi

一般的な状況では、トークンをクリップボードにコピーします。パイプがある場合はトークンを作成する必要がありますstdoutが(有効です)、何らかの理由でパイプの次のコマンドは実行されません。この問題に関連しているようですが、どのようにread解決するのかわかりません。

例えば

$ stc | tee

明らかにする

$ stc | tee
Password <token echo>
<hangs forever>

答え1

xclipCLIPBOARD 選択要求を処理するためにバックグラウンドで実行される子プロセスをフォークします。ここで、子プロセスはパイプを継承し、クリップボードの選択をリサイクルするときに他のプロセスが終了するまでそれを開いたままにします。ここでは、次の操作を行います。

#! /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"

(あなたも忘れました。IFS=-rオプションread、しかも周りの引用$TOKENそれからecho任意のデータと一緒に使用することはできません)。

関連情報