我希望有人解释一下为什么以下做工作:
# < /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
什么是
<
?它是命令输入的重定向以从文件中读取。您可以将其放在命令之前或之后:
$ echo abcd > in $ cat in abcd $ cat <in abcd $ <in cat abcd
简单来说,该命令读取文件。
cat in
和之间的区别cat <in
在于,它<
为进程设置 STDIN(标准输入)的重定向cat
,而 是cat in
一个in
参数,cat
命令必须在内部对其执行某些操作。 (打开它,然后阅读它,等等)什么是
|
?它是对进程的重定向。它只能遵循命令:
$ | cat in bash: syntax error near unexpected token `|' $ cat in | cat abcd $ cat in | cat | >
(...正在等待输入...)
这是做什么的:
< /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
- 这是接收重定向的进程
整条线都很有道理,不是吗?
这是什么:
< /dev/urandom | tr -dc 'a-zA-Z' | head -c 12
?分解:
< /dev/urandom
-没有命令和重定向自/dev/urandom
|
- 使用匿名管道重定向到进程tr -dc 'a-zA-Z'
- 接收重定向的进程- 等等...
这是怎么回事?第一个“句子”中没有命令。
什么是
>
?这是将此命令的输出重定向到文件。与 相同
<
,它可以在命令之前或之后使用:$ >out echo abcd $ cat out abcd $ echo dcba >tuo $ cat tuo dcba
这是做什么的:
gunzip < HP-Fax4-hpcups.ppd.gz | cat > ouT1
?分析:
gunzip < HP-Fax4-hpcups.ppd.gz
= 重定向HP-Fax4-hpcups.ppd.gz
至gunzip
(让我们gunzip
读取此文件)|
- 将输出重定向到进程cat > ouT1
=cat
是接收重定向的过程,然后将其输出重定向到文件ouT1
这可以。所有的片段都有道理。
那么这是什么:
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
是一个简单的文本文件,因此我认为有一个空行。