Bash 学习之后台运行 jar 程序

# 不挂断, 后台运行jar程序
nohup java -jar app.jar >log 2>&1 &
# nohup java -jar app.jar &>log &

解释:

  • 每个程序在运行后,都会至少打开三个文件描述符,分别是
    • 0: stdin 标准输入;1: stdout 标准输出;2: stderr 标准错误输出
  • 上面的命令表示, 将 app.jar 的 标准输出 重定向到 log 文件中,同时将 标准错误 也重定向到 log 文件中,最后一个 & 表示后台运行。
  • 2>&1 表明将文件描述 2(标准错误输出)的内容重定向到文件描述符 1(标准输出)
    • 为什么 1 前面需要 & 呢?
      • 当没有 & 时,1 会被认为是一个普通的文件,有 & 表示重定向的目标不是一个文件,而是一个文件描述符
  • 文件描述符 1 和 2 都指向了 log 文件,也就表达了将标准错误输出重定向到文件中
  • why?以这样的方式调用脚本,可以很好的将错误信息保存,帮助我们定位问题
  • 1> 可省略: >file == 1>file
  • &>file 相当于 1>file 2>&1 (等同与 1>file 2>file 的含义. ps: 直接使用行不通的,因为文件在不同的文件描述符下打开了两次. 文件中的文本将是混乱的)
    • 上面的命令可简写为: nohup java -jar app.jar &>log &
    • 同样, program &>> result.txt 等同于 program >> result.txt 2>&1

(完)

shell 中!叫做事件提示符,英文是:Event Designators,可以方便的引用历史命令, 也就是history中记录的命令

  1. ! 当后面跟随的字母不是空格、换行、回车、=和 ( 时,做命令替换
  2. !n 会引用history中的第n个命令,比如输入!100,就是执行history列表中的第100条命令
  3. !-n 获取history中倒数第N个命令并执行,比如输入!-1,就会执行上一条命令;
  4. !!是!-1的一个alias ,因为执行上一条命令的情况比较多一些,一般如果只是执行上一条命令只按下键盘中的↑即可,有时候如果命令前加点东西执行起来会快一点
  5. !string引用最近的以 string 开始的命令。这条命令在你运行一个命令之后忘记了这个命令的参数是什么,直接!命令既可
  6. !?字符串 指向最近一次包含此字符串的命令
  7. !$传递上一个命令中的参数
1.
> history | grep echo
1013  2012-12-20 12:24:40 echo ""
1014  2012-12-20 12:24:45  echo "22"
> !1014
 echo "22"
22
2.
> !-1
 echo "22"
22
3.
> apt-get install xxx    //Permission Denied. You need to be sudo to do this!
> sudo !!   
4.
> echo "123" "213" "33"
123 213 33
> !echo
echo "123" "213" "33"
123 213 33
5.
> !?123
echo "123" "213" "33"
123 213 33
6.
> ls -l
> ls !$

| 为管道符号,将 “|” 前面命令的输出作为 “|” 后面的输入。
&& 代表上一个成功才执行下一个;
|| 代表上一个失败才执行下一个;
; 分号 代表无关联顺序执行;
& 代表前一个命令进入后台,并立即执行后面的命令;

一. Bash = 命令 + 参数

参数之间多余的空格, Bash会自动忽略
echo hello world
上面其实是两个参数, Bash 使用空格(或 Tab 键)区分不同的参数。

二. type命令告诉我们,echo是内部命令,ls是外部程序

命令分为builtin内建和hashed 外部程序(/bin/下)
type命令的-t参数,可以返回一个命令的类型(五类):
别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)。

三、模式扩展(globbing)

bash支持8种globbing扩展,glob N-COUNT. 水滴。
其中用到一些通配符号,叫通配符扩展(wildcard expansion)
Bash 是先进行扩展,再执行命令。
模式扩展与正则表达式的关系是,模式扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便。

? 单个
* 0~多个
[abc] 单个
[^abc] or [!abc] 排除 [[abc] 包含'[' [-abc]or[abc-] 包含'-' [a-b] [A-B] 代表a到b,并不包含'-'
[!a-zA-Z]
{1,2} 不是文件名扩展,总是会挨个输出
a.log{,.bak} 代表 '空'a.log 和 a.log.bak
{a..c} a b c {5..1} 5 4 3 2 1 {c..a} c b a
{}扩展通常作为创建时的参数
for i in {1..4}
do
	echo $i
done
{start..end..step} {0..8..2} 0 2 4 6 8
变量扩展:bash视$开头的为变量。$SHELL == ${SHELL}
${!string*}${!string@}返回所有匹配给定字符串string的变量名。
子命令扩展:$()该命令的所有输出都会作为返回值
算术扩展$(( )):echo $((2 + 2))
量词语法:
?() 0,1
*() 0,1,~
+() 1,~
@() 1
!() 0,~

$ ls abc?(.)txt
abctxt abc.txt
shopt命令调整 Bash 的行为,与模式扩展有关
# 打开某个参数
$ shopt -s [optionname]

# 关闭某个参数
$ shopt -u [optionname]

# 查询某个参数关闭还是打开
$ shopt [optionname]
eg
dotglob参数可以让扩展结果包括隐藏文件(即点开头的文件)
nullglob参数可以让通配符不匹配任何文件名时,返回空字符
failglob参数使得通配符不匹配任何文件名时,Bash 会直接报错,而不是让各个命令去处理。
extglob参数使得 Bash 支持 ksh 的一些扩展语法。比如量词语法
nocaseglob参数可以让通配符扩展不区分大小写
globstar参数可以使得**匹配零个或多个子目录。该参数默认是关闭的

Cron 表达式

{秒数} {分钟} {小时}  {日期} {月份}  {星期}      [{年份} 可不填]

0/2 * * * * ? # 表示每2秒 执行任务

(秒 / 分 / 时) (日 DoM / 月) (周 DoW) [年份]

各字段描述

  1. Seconds (秒) 可以用数字0-59 表示,

  2. Minutes (分) 可以用数字0-59 表示,

  3. Hours (时) 可以用数字0-23表示,

  4. Day-of-Month (天) 可以用数字1-31 中的任一一个值,但要注意一些特别的月份

  5. Month (月) 可以用 1-12 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示

  6. Day-of-Week (每周) 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示

符号

* 表示所有值
? 表示未说明的值,即不关心它为何值
- 表示一个指定的范围
, 表示附加一个可能值
/ 符号前表示开始时间,符号后表示每次递增的值
L(“last”)
W(“weekday”)
C 指和calendar联系后计算过的值

二叉树遍历

  • 前:根 - 左 - 右(向前遍历,以相对较前面的为起点)
  • 中:左 - 根 - 右(像中遍历,以最前面为起点)
  • 后:左 - 右 - 根(像后遍历,以最前面为起点)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值