bash 再次重定向:问题很难理解 2 个类似的命令

bash 再次重定向:问题很难理解 2 个类似的命令

我希望有人解释一下为什么以下工作:

# < /dev/urandom  tr -dc 'a-zA-Z' | head -c 12

没有“|”前t,但以下情况则不然:

# < /dev/urandom | tr -dc 'a-zA-Z' | head -c 12

(这是一个简单的密码生成器)

您还可以解释一下它与以下内容有何不同:

# gunzip < HP-Fax4-hpcups.ppd.gz cat > ouT1 --- 这当然失败了:

gzip: cat.gz: No such file or directory 

如果“|”在猫之前被排除在外;然而,它可以与“|”一起使用(管道)之前cat,即

 # gunzip < HP-Fax4-hpcups.ppd.gz | cat >  ouT1

答案1

  1. 什么是<

    它是命令输入的重定向以从文件中读取。您可以将其放在命令之前或之后:

    $ echo abcd > in
    $ cat in
    abcd
    $ cat <in
    abcd
    $ <in cat
    abcd
    

    简单来说,该命令读取文件。cat in和之间的区别cat <in在于,它<为进程设置 STDIN(标准输入)的重定向cat,而 是cat in一个in参数,cat命令必须在内部对其执行某些操作。 (打开它,然后阅读它,等等)

  2. 什么是|

    它是对进程的重定向。它只能遵循命令:

    $ | cat in
    bash: syntax error near unexpected token `|'
    $ cat in | cat
    abcd
    $ cat in | cat |
    > 
    

    (...正在等待输入...)

  3. 这是做什么的:< /dev/urandom tr -dc 'a-zA-Z' | head -c 12

    将其分解为更小的部分(带有重定向的命令):

    • < /dev/urandom tr -dc 'a-zA-Z'=tr -dc 'a-zA-Z'< /dev/urandom

      含义:对您阅读的内容进行翻译urandom

    • |- 使用匿名管道重定向到进程

    • head -c 12- 这是接收重定向的进程

    整条线都很有道理,不是吗?

  4. 这是什么:< /dev/urandom | tr -dc 'a-zA-Z' | head -c 12

    分解:

    • < /dev/urandom-没有命令和重定向自/dev/urandom
    • |- 使用匿名管道重定向到进程
    • tr -dc 'a-zA-Z'- 接收重定向的进程
    • 等等...

    这是怎么回事?第一个“句子”中没有命令。

  5. 什么是>

    这是将此命令的输出重定向到文件。与 相同<,它可以在命令之前或之后使用:

    $ >out echo abcd
    $ cat out
    abcd
    $ echo dcba >tuo
    $ cat tuo
    dcba
    
  6. 这是做什么的:gunzip < HP-Fax4-hpcups.ppd.gz | cat > ouT1

    分析:

    • gunzip < HP-Fax4-hpcups.ppd.gz= 重定向HP-Fax4-hpcups.ppd.gzgunzip(让我们gunzip读取此文件)
    • |- 将输出重定向到进程
    • cat > ouT1=cat是接收重定向的过程,然后将其输出重定向到文件ouT1

    这可以。所有的片段都有道理。

  7. 那么这是什么:gunzip < HP-Fax4-hpcups.ppd.gz cat > ouT1

    我不能百分百确定所有相关方对此有何解释,但让我们推测一下。错误是这样的:

    gzip: cat.gz: No such file or directory 
    

    此错误中的第一个单词是gzip,因此我们知道 gzip 已运行。我们还知道(至少我知道),重定向是在解释命令之前由 sell 设置的。所以我这样分析:

    • < HP-Fax4-hpcups.ppd.gz- shell 将进程输入重定向设置为HP-Fax4-hpcups.ppd.gz,即。要执行的命令将从该文件中读取
    • > ouT1- 命令的输出将被重定向到ouT1

    到目前为止,一切都很好。现在桌上剩下的就是:gunzip cat。对此的标准解释是,这gunzip是一个命令,也是cat它的参数。现在gunzip运行(设置了 IN 和 OUT 重定向),并且它获取字符串cat作为其第一个参数。不知何故它会抛出错误:

    gzip: cat.gz: No such file or directory
    

    又是什么意思?说gzip是找不到cat.gz。它想用它做一些事情(很可能打开它),但没有这样的文件或目录。因此,它为什么cat.gz要把cat它作为一个论点,这一定是它的内部问题。一个简单的实验表明,它期望参数采用 gzip 格式:

    $ echo asdf > cat.gz
    $ gunzip < in  cat >  ouT1
    
    gzip: cat.gz: not in gzip format
    

    这里的文件in是一个简单的文本文件,因此我认为有一个空行。

相关内容