我想了解有关以下命令正在执行的操作的更多详细信息:
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
.