为什么重定向在`< / dev / urandom tr |工作;这怎么解析?

时间:2018-06-07 20:53:34

标签: bash shell

我用它来制作密码:

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:] ...

没有意义。

  • LC_CTYPE正在设置字符类型。得到了。
  • tr正在将字符转换为集合中的字符:graph:。得到了。
  • 回音是为了给出换行符。
  • 但是如何将urandom重定向到env变量设置 表达。 ?
  • tr如何知道从它之前检索urandom。 ?

对我而言似乎应该是:

echo $(LC_CTYPE=C tr -cd [:graph:] < /dev/urandom | tr -d '\n' | head -c32) # pwg ##2nd

哪个也有效。我无法理解为什么第一个变体有效?

2 个答案:

答案 0 :(得分:4)

手册中的一些信息:

3.6 Redirections

  

在执行命令之前,可以使用shell解释的特殊表示法重定向其输入和输出...以下重定向运算符可以在简单命令之前或出现在任何位置,或者可以跟随命令。 ...

3.7.1 Simple Command Expansion

  

执行简单命令时,shell会从左到右执行以下扩展,分配和重定向。

     
      
  1. 解析器标记为变量赋值(在命令名称前面的那些)和重定向的单词将保存以供以后处理
  2.   
  3. 扩展非变量赋值或重定向的单词(请参阅Shell Expansions)。如果在扩展后仍有任何单词,则第一个单词将被视为命令的名称,其余单词则为参数。
  4.   
  5. 如上所述执行重定向(请参阅重定向)。
  6.   
  7. 每个变量赋值中'='之后的文本在分配给变量之前会经历波浪扩展,参数扩展,命令替换,算术扩展和引用删除。
  8.   

答案 1 :(得分:2)

<没有重定向到<之前的东西 - 它只是重定向到stdin。所以订单并不重要。无论它在命令行< /dev/urandom中重定向命令的stdin来自/ dev / urandom。在命令之前,在命令之后,在一些参数之前,在参数之后,无关紧要。它只是从指定的文件或设备重定向stdin。