Shell-Script
如何將變數值發送到管道,同時將其隱藏在程序列表中?
我正在編寫一個簡單的 shell 腳本,它讀取一個 PIN 一次(到一個變數中)並使用它來呼叫幾個需要這個 pin 的命令。可以指示這些命令從標準輸入讀取 PIN,但我不知道如何將變數值發送到管道而不在程序列表中顯示它。通常的方式 - 使用
echo "$PIN"
- 將執行替換,因此 PIN 的值將通過程序列表對其他使用者可見。是否有接受變數名並將該變數的值輸出到標準輸出的命令?還是有其他方法?
由於
echo
在所有 shell 中都內置,它不會顯示在程序列表中。您可以使用
printf '%s\n' "$PIN"
更可靠的東西,但請注意,一些基於 pdksh 的 shell 仍然沒有printf
內置。解決這些問題的方法是使用print -r -- "$PIN"
.zsh
和 的所有實現ksh
,但不是標準命令。您還可以使用此處的文件:
cmd << EOF $PIN EOF
(或這裡的字元串 (
cmd <<< "$PIN"
) inzsh
和其他一些 shell)。但請注意,在大多數實現中,here-documents 是使用臨時文件實現的,因此如果文件已送出到磁碟,則 PIN 可能可以離線恢復。
PIN
如果可以避免它,最好不要導出到環境,因為它更容易被其他程序發現(查看/proc/pid/environ
具有相同 uid 的程序可以讀取哪些程序,而對於可以讀取另一個程序的記憶體的內容通常有更多限制) .ps
在一些(罕見的)系統上還可以讓您看到任何程序的環境。但是,一旦進入環境,在某些系統上,有一個
printenv
命令可以顯示其值:printenv PIN
或者您可以隨時使用
perl
:perl -le 'print $ENV{PIN}'