理解Unix shell脚本调用

时间:2016-03-17 14:07:25

标签: bash shell unix

我有一个Unix shell脚本:

#!/bin/bash
java -jar lib/<some_jar_file_name_here>.jar $* > /dev/null 2>&1 &

当我运行此脚本时,我传递一个命令行参数。

我想了解$*>/dev/null2>&1 &

的含义

jar文件名后的额外字符是什么意思?

3 个答案:

答案 0 :(得分:3)

shell专门处理几个参数。这些参数只能被引用;不允许分配给他们。

$*从1开始扩展到位置参数。当扩展不在双引号内时,每个位置参数都会扩展为单独的单词。在执行它的上下文中,这些单词受到进一步的单词拆分和路径名扩展的影响。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔。也就是说,&#34; $ *&#34;相当于&#34; $ 1c $ 2c ...&#34;,其中c是IFS变量值的第一个字符。如果未设置IFS,则参数由空格分隔。如果IFS为null,则连接参数时不会插入分隔符。

> /dev/null 2>&1

在执行命令之前,可以使用shell解释的特殊表示法重定向其输入和输出。重定向还可用于打开和关闭当前shell执行环境的文件。以下重定向运算符可以在简单命令之前或出现在任何位置,也可以跟随命令。重定向按其出现的顺序从左到右处理。

重定向输出     输出的重定向导致打开名称由word扩展产生的文件以便在文件描述符n上写入,或者如果未指定n则打开标准输出(文件描述符1)。如果文件不存在则创建;如果确实存在则将其截断为零大小。

重定向输出的一般格式为:

       [n]>word

如果重定向运算符是&gt;,并且已启用set builtin的noclobber选项,则     如果名称来自word扩展的文件存在且是常规文件,则重定向将失败。如果重定向运算符是> |,或者重定向运算符是&gt;并且未启用set builtin命令的noclobber选项,即使以word命名的文件存在,也会尝试重定向。

/dev/null - 标准文件,丢弃您写入的所有内容,但报告写入操作成功。 1是stdout,2是stderr

&

如果命令由控制操作符&amp;终止,则shell在子shell中在后台执行命令。 shell不等待命令完成,返回状态为0。

答案 1 :(得分:2)

$*扩展为传递给脚本的所有参数。

2>&1stderr(通常发送错误消息的输出流)重定向到stdout(通常用于“正常输出”的输出流)。

> /dev/nullstdout发送到null设备,实际上忽略了它。由于我们还将stderr重定向到stdout,我们还会将stderr输出发送到/dev/null

2>&1 >/dev/null(或>/dev/null 2>&1)是非常常见的模式,并且热情地表示“我不希望看到此应用程序的任何控制台输出!”

&在后​​台执行对java的调用,以便在脚本的下一行继续执行,而不是等待java返回。

答案 2 :(得分:1)

$* - 表示&#34;所有cmd行参数&#34;

2>&1 - 表示&#34;将STDERR重定向到STDOUT&#34;

> /dev/null - 表示&#34;忽略并且不打印脚本的输出&#34;

最后

&表示&#34;将流程发送到后台&#34;。在这种情况下,你结束你的终端会话,该过程将被杀死