我正在编写一个简单的 shell 脚本,该脚本读取 PIN 一次(到变量中)并使用它来调用需要此 PIN 的多个命令。可以指示这些命令从标准输入读取 PIN,但我不知道如何将变量值发送到管道而不在进程列表中显示它。通常的方式 - 使用echo "$PIN"
- 将执行替换,以便其他用户可以通过进程列表看到 PIN 的值。
是否有一个命令接受变量名称并将该变量的值输出到标准输出?或者还有其他办法吗?
答案1
正如echo
所有 shell 中内置的那样,它不会显示在进程列表中。
您可以使用printf '%s\n' "$PIN"
更可靠的东西,但请注意,一些基于 pdksh 的 shell 仍然没有printf
内置。解决这些问题的方法是使用print -r -- "$PIN"
.在和 的所有实现print
中可用,但不是标准命令。zsh
ksh
您还可以使用此处文档:
cmd << EOF
$PIN
EOF
(或者现在在此处使用字符串 ( cmd <<< "$PIN"
)zsh
和其他一些 shell)。但请注意,在大多数实现中,此处文档都是使用临时文件实现的,因此如果文件已提交到磁盘,则 PIN 可以脱机恢复。
如果可以避免的话最好不要导出PIN
到环境,因为它更容易被其他进程发现(可以看出具有/proc/pid/environ
相同 uid 的进程可以读取,而对于哪些进程可以读取另一个进程的内存通常有更多限制) 。ps
在某些(罕见)系统上还可以让您查看任何进程的环境。
不过,一旦进入环境,在某些系统上,有一个printenv
命令可以显示其值:
printenv PIN
或者你可以随时使用perl
:
perl -le 'print $ENV{PIN}'