我用它来制作密码:
echo $(LC_CTYPE=C < /dev/urandom tr -cd [:graph:] | tr -d '\n' | head -c32) # pwg ##1st
改变长度,图表到alnum,或其他什么。
我不了解正在使用的重定向。我理解外部$()格式但是这个
echo $(LC_CTYPE=C < /dev/urandom tr -cd [:graph:] ...
没有意义。
tr
正在将字符转换为集合中的字符:graph:。得到了。tr
如何知道从它之前检索urandom。 ?对我而言似乎应该是:
echo $(LC_CTYPE=C tr -cd [:graph:] < /dev/urandom | tr -d '\n' | head -c32) # pwg ##2nd
哪个也有效。我无法理解为什么第一个变体有效?
答案 0 :(得分:4)
手册中的一些信息:
在执行命令之前,可以使用shell解释的特殊表示法重定向其输入和输出...以下重定向运算符可以在简单命令之前或出现在任何位置,或者可以跟随命令。 ...
3.7.1 Simple Command Expansion
执行简单命令时,shell会从左到右执行以下扩展,分配和重定向。
- 解析器标记为变量赋值(在命令名称前面的那些)和重定向的单词将保存以供以后处理。
- 扩展非变量赋值或重定向的单词(请参阅Shell Expansions)。如果在扩展后仍有任何单词,则第一个单词将被视为命令的名称,其余单词则为参数。
- 如上所述执行重定向(请参阅重定向)。
- 每个变量赋值中'='之后的文本在分配给变量之前会经历波浪扩展,参数扩展,命令替换,算术扩展和引用删除。
醇>
答案 1 :(得分:2)
<
没有重定向到<
之前的东西 - 它只是重定向到stdin。所以订单并不重要。无论它在命令行< /dev/urandom
中重定向命令的stdin来自/ dev / urandom。在命令之前,在命令之后,在一些参数之前,在参数之后,无关紧要。它只是从指定的文件或设备重定向stdin。