什么是@!在路径名称之前执行ksh脚本

时间:2014-10-08 18:43:17

标签: unix ksh

基本上我想知道这行脚本代码的作用

function make_expand_query_string_shell {
    cat <<DONE | tr '@' '#'
    @!/usr/bin/ksh
    DONE

1 个答案:

答案 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