如果我yes "I like cheese"
在 bash 中运行,我将得到无尽的输出
I like cheese
I like cheese
...
...
但是,我想在每一行上打印一个随机字符串,并认为使用yes
可以实现此目的。所以我尝试了这个命令:
yes `echo $(tr -dc A-Za-z0-9 </dev/urandom | head -c 10)`
问题是它一遍又一遍地打印相同的字符串,因为yes
只取第一个结果
`echo $(tr -dc A-Za-z0-9 </dev/urandom | head -c 10)`
计算结果为,这是一个随机字符串(例如d8pTVeZYyi
)
因此结果就是无休止地输出:
d8pTVeZYyi
d8pTVeZYyi
d8pTVeZYyi
...
我怎样才能使该命令替换在每一行上运行?结果是:
d8pTVeZYyi
HCmjUpGOIq
K3e8aquaiK
mMJBZYkHJM
...
PS 总体目标是能够在合理的时间内生成每行包含随机字符串的大型文本文件。这些是出于测试目的。
答案1
问题在于表达式echo $(tr -dc A-Za-z0-9 </dev/urandom | head -c 10)
仅在启动时被评估一次,yes
因此所有后续迭代都只打印出该表达式的结果。
其他一些选择:
while true; do
tr -dc A-Za-z0-9 </dev/urandom | head -c 10
echo ""
done
或者
while true; do
rand=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 10)
echo "$rand"
done
或者更好(厚颜无耻地从@steeldriver 的评论):
tr -dc A-Za-z0-9 </dev/urandom | fold -w10