Bash
腳本讀取命令時管道標準輸出
我有一個小腳本(稱為 stc)來創建一個 SecureToken
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>
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
不能用於任意數據)。