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



我用它来制作密码:

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: 中的字符。知道了。
  • 回声在那里给出换行符。
  • 但是如何将随机重新分配到 env 变量设置 表达。?
  • 怎么,tr知道从它之前检索urandom。

对我来说,它似乎是:

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

这也行得通。我只是不明白为什么第一个变体有效?

手册中的一些信息:

3.6 重定向

在执行命令之前,可以使用由 shell 解释的特殊符号重定向其输入和输出...以下重定向运算符可能位于简单命令的前面或出现在任何位置,也可能出现在命令之后。...

3.7.1 简单的命令扩展

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

  1. 解析器标记为变量赋值(命令名称前面的单词(和重定向的单词将被保存以供以后处理
  2. 不是变量赋值或重定向的单词将被展开(请参阅外壳扩展(。如果扩展后仍有任何单词,则第一个单词被视为命令的名称,其余单词是参数。
  3. 重定向
  4. 按上述方式执行(请参阅重定向(。
  5. 每个变量赋值中"="后面的文本在分配给变量之前会经历波浪号扩展、参数扩展、命令替换、算术扩展和引号删除。
<

不会重定向到<之前的东西 - 它只是重定向到stdin。 所以顺序并不重要。 无论它在命令行中的哪个位置< /dev/urandom都将命令的 stdin 重定向到来自/dev/urandom。 在命令之前,在命令之后,在一些参数之前,在参数之后,都无关紧要。 它只是从指定的文件或设备重定向 stdin。

最新更新