基本上我想知道这行脚本代码的作用
function make_expand_query_string_shell {
cat <<DONE | tr '@' '#'
@!/usr/bin/ksh
DONE
答案 0 :(得分:3)
cat <<DONE | tr '@' '#'
@!/usr/bin/ksh
DONE
这是一个Unix&#34;管道&#34;将一些有用的实用程序绑在一起以创建一些输出。
shell本身将读取第一行,并将其分解为:
cat
- 是程序的名称,可在PATH
上找到。 cat
程序用于con cat
一起创建文件。<<
- 用于&#34;重定向&#34;在它之前的程序的标准输入。由于cat
和<<
之间没有任何内容,程序将在没有任何命令行参数(例如文件名)的情况下启动,并且像许多shell实用程序一样,将期望其输入来自&#34;标准输入&#34;流。DONE
是一个符号,基本上是<<
的参数。|
指示shell来管道&#34;程序左侧(cat
)到右侧程序(tr
)的标准输出。tr
是另一个程序的名称。其目的是tr
anslate或tr
安置字符。'@' '#'
是tr
的命令行参数。 <<
功能称为&#34; here-document。&#34;每个Unix程序都有三个标准I / O流(除非在特殊情况下) - 标准输入,输出和错误输出。通常,这三个都连接到您的终端。
但是,在这种情况下,<<
基本上将标准输入链接到脚本文件中的行序列本身,直到它读取与给定的结束符号匹配的行 - 在本例中为{{ 1}}。它被称为&#34; here-document&#34;因为输入到输入的文件被给予&#34;这里&#34; - 立即在脚本文件中。
正如@KeithThompson推荐的那样,你可以在DONE
手册中找到这个,通过搜索&#34;&lt;&lt;&#34;:
ksh
同样,<<[-]word
The shell input is read up to a line that is the same as
word after any quoting has been removed, or to an end-of-
file. No parameter substitution, command substitution,
arithmetic substitution or file name generation is per-
formed on word. The resulting document, called a here-
document, becomes the standard input. If any character
of word is quoted, then no interpretation is placed upon
the characters of the document; otherwise, parameter
expansion, command substitution, and arithmetic substitu-
tion occur, \new-line is ignored, and \ must be used to
quote the characters \, $, �. If - is appended to <<,
then all leading tabs are stripped from word and from the
document. If # is appended to <<, then leading spaces
and tabs will be stripped off the first line of the docu-
ment and up to an equivalent indentation will be stripped
from the remaining lines and from word. A tab stop is
assumed to occur at every 8 columns for the purposes of
determining the indentation.
正在从|
获取输出并将其直接传递给cat
的输入。
那么,这两个程序做了什么?我们来看看他们的手册。
tr
好的......所以,这会将其标准输入连接到其标准输出。那么NAME
cat - concatenate files and print on the standard output
SYNOPSIS
cat [OPTION]... [FILE]...
DESCRIPTION
Concatenate FILE(s), or standard input, to standard output.
呢?
tr
...
NAME
tr - translate or delete characters
SYNOPSIS
tr [OPTION]... SET1 [SET2]
DESCRIPTION
Translate, squeeze, and/or delete characters from standard input, writ-
ing to standard output.
所以 SETs are specified as strings of characters. Most represent them-
selves.
很好地将SET1中的字符转换为SET2中相同位置的字符。看起来我们有两套,每套只有一个,所以很容易看出会发生什么。
由于tr
对其输入没有任何作用,只是将其复制到输出中,因此它被用于有效地复制here-document作为cat
的输入。反过来,tr
会将其输入中的每个tr
转置为@
。
这创造了一个典型的Unix&#34; shebang&#34;第#
行。
整个序列是
的更华丽的版本#!/usr/bin/ksh