代码之家  ›  专栏  ›  技术社区  ›  pbhj

为什么在`</dev/urandom tr tr`中重定向是有效的;这是如何解析的?

  •  0
  • pbhj  · 技术社区  · 8 年前

    我用这个做密码:

    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 正在将字符转换为集合中的字符:图形:。明白了。
    • 回声是用来断线的。
    • 但是你如何将urandom重设为env变量 表达式。?
    • 如何,做 TR 知道从它之前取回天王星。?

    在我看来应该是:

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

    这也管用。我只是不明白为什么第一个变型是有效的?

    2 回复  |  直到 8 年前
        1
  •  4
  •   glenn jackman    8 年前

    手册中的一些信息:

    3.6 Redirections

    在执行命令之前,可以使用shell解释的特殊符号重定向其输入和输出…以下重定向运算符可以 出现在简单命令的前面或后面 . …

    3.7.1 Simple Command Expansion

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

    1. 语法分析器标记为 变量赋值 (在命令名之前)和 将保存重定向以供以后处理 .
    2. 非变量赋值或重定向的单词将被展开(请参阅shell展开)。如果扩展后仍有任何单词,则第一个单词将被视为命令的名称,其余单词将成为参数。
    3. 重定向按上述方式执行(请参阅重定向)。
    4. 在每个变量赋值中,=后面的文本在被赋值给变量之前都要进行颚化符展开、参数展开、命令替换、算术展开和引号移除。
        2
  •  2
  •   Chris Dodd    8 年前

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

    推荐文章