Bash

腳本讀取命令時管道標準輸出

  • September 22, 2022

我有一個小腳本(稱為 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

在正常情況下,它將令牌複製到剪貼板。當有一個管道時,應該將令牌寫入stdout(這是有效的),但由於某種原因,管道中的下一個命令沒有執行。我認為這與read但不知道如何解決這個問題有關。

例如

$ stc | tee

結果是

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

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"

(您還忘記了IFS=-r選項read引號,$TOKEN並且echo不能用於任意數據)。

引用自:https://unix.stackexchange.com/questions/718215