这个命令有什么作用(奇怪的分配和重定向)

这个命令有什么作用(奇怪的分配和重定向)

我想了解有关以下命令正在执行的操作的更多详细信息:

PASSING=0 FAILED=0 > log_${ENV} print "Test Started at `date`\n"

答案1

该命令可以重写为

PASSING=0 FAILED=0 print "Test Started at `date`\n" >log_${ENV}

因为重定向可能发生在命令行上的任何点。

重定向将命令的输出发送print到名为 的文件log_${ENV}(或者log_$ENV,花括号在这里不会执行任何操作),其中ENV应该是一个 shell 变量,其中包含当前环境中存在的某个值。

PASSING对和的两个赋值FAILED将在命令的环境中设置这两个变量print。执行此行后它们将不存在(除非它们之前在脚本中存在,在这种情况下,执行此命令行后它们的原始值将保持不变)。

由于print它似乎没有使用这两个变量(除非它是脚本或函数或其他我们不知道的东西),所以很难说这些变量的意图是什么。

print事物将文本字符串作为其唯一参数,其中字符串的一部分是旧式命令替换,它将在调用date之前扩展到命令的输出print。使用更现代的命令替换语法,参数也可以写为"Test Started at $(date)\n".

整体效果会大概(取决于什么print)将给定的文本字符串写入一个特定的文件中,该文件的名称取决于 value $ENV

有关的:


In ksh93(and zsh),print是一个 shell 内置实用程序,其作用(粗略地说)有点像echo。该 shell 还以一种特殊的方式进行处理,因为它将在启动交互式 shell 时$ENV获取指向的文件。$ENV不建议在 shell 脚本中使用它(或一般的大写变量)作为通用变量。

与此相关:

答案2

您必须“解析”(解释)命令行(分为单词):

PASSING=0 FAILED=0 >log_${ENV} print "Test Started at `date`\n"
\___  __/ \__  __/ \___  ____/ \_ _/  \_________  ____________/
    \/       \/        \/        \/             \/
   var1     var2    redirect    cmd    "Argument to command".

这些是组成命令行的五个单词(以空格分隔)。

  • 命令之前的 var(例如 in)var=123 cmd将在命令执行期间(仅)在环境中定义。然后,它将被丢弃。

    可以定义几个变量命令名称。

  • 重定向用于将输出发送到文件或从文件读取输入。重定向可以出现在命令行的任何位置,并将应用于整个命令行(命令执行)。

    在这种情况下,重定向是输出到一个称为单词和变量(部分)log_内的值的串联的文件。ENV$(ENV)

  • print显然,本例中的命令名称。

    此命令名称(作为内置命令)存在于 ksh、mksh、lksh 和 zsh 中,但不存在于 ash、dash、csh、yash、bash(和其他)中。在这些 shell 中,该命令可能作为外部程序存在,可以在 PATH 中找到。

  • 参数是为命令提供的参数、文本或其他信息的列表,在 c 程序中可用作为argv[]int argc,或者在 shell 中可用作为$@$#

    在这种情况下,参数包括一个命令扩展`date`,相当于(在现代语法中,强烈推荐)$(date)。该部分将执行命令(在本例中)date并将用命令的输出替换整个部分。简而言之:将实际日期放在那个地方。

整个命令也可以写成(达到完全相同的效果):

PASSING=0 FAILED=0   print "Test Started at `date`\n"     >log_${ENV}

由于没有足够的信息,似乎正在将一个字符串打印到日志文件中。如果确实是上面提到的内置打印,则这两个变量将不起作用,可以将其删除以将命令编写为:

print "Test Started at `date`\n"     >log_${ENV}

但这只是一个有根据的猜测,要真正了解 print 命令在做什么,您需要更深入地挖掘。您需要说明哪个 shell 正在运行该命令以及(如果对您的 shell 有效)type print.

相关内容