# 不挂断, 后台运行jar程序
nohup java -jar app.jar >log 2>&1 &
# nohup java -jar app.jar &>log &
解释:
- 每个程序在运行后,都会至少打开三个文件描述符,分别是
- 0:
stdin
标准输入;1:stdout
标准输出;2:stderr
标准错误输出
- 0:
- 上面的命令表示, 将 app.jar 的 标准输出 重定向到 log 文件中,同时将 标准错误 也重定向到 log 文件中,最后一个 & 表示后台运行。
2>&1
表明将文件描述 2(标准错误输出)的内容重定向到文件描述符 1(标准输出)- 为什么 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中记录的命令
- ! 当后面跟随的字母不是空格、换行、回车、=和 ( 时,做命令替换
- !n 会引用history中的第n个命令,比如输入!100,就是执行history列表中的第100条命令
- !-n 获取history中倒数第N个命令并执行,比如输入!-1,就会执行上一条命令;
- !!是!-1的一个alias ,因为执行上一条命令的情况比较多一些,一般如果只是执行上一条命令只按下键盘中的↑即可,有时候如果命令前加点东西执行起来会快一点
- !string引用最近的以 string 开始的命令。这条命令在你运行一个命令之后忘记了这个命令的参数是什么,直接!命令既可
- !?字符串 指向最近一次包含此字符串的命令
- !$传递上一个命令中的参数
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) [年份]
各字段描述
-
Seconds (秒) 可以用数字0-59 表示,
-
Minutes (分) 可以用数字0-59 表示,
-
Hours (时) 可以用数字0-23表示,
-
Day-of-Month (天) 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
-
Month (月) 可以用 1-12 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
-
Day-of-Week (每周) 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
符号
* 表示所有值
? 表示未说明的值,即不关心它为何值
- 表示一个指定的范围
, 表示附加一个可能值
/ 符号前表示开始时间,符号后表示每次递增的值
L(“last”)
W(“weekday”)
C 指和calendar联系后计算过的值
二叉树遍历
- 前:根 - 左 - 右(向前遍历,以相对较前面的为起点)
- 中:左 - 根 - 右(像中遍历,以最前面为起点)
- 后:左 - 右 - 根(像后遍历,以最前面为起点)