From 生信技能树
-视频回放:Linux-conda的安装及使用2
-课件:
-总课时长:2小时28分13秒 1小时10分开始~
-主讲人:卖萌哥
•Shell 脚本
•任务提交
Shell 脚本
shell 脚本:为了和普通文本文件区分开,通常shell脚本都会以.sh为后缀名.。
瞎子(电脑)打灯笼(后缀):并不是电脑不知道这是什么文件,而是为了让你知道这是什么文件。
Vim 编辑器
Mar23 23:16:22 ~
$ vim file1
Mar23 23:17:18 ~
$ bash file1
Welcome to Biotrainee()
脚本首行的#! 是Linux的Shebang (释伴)符号,指定解释器。
我觉得可以理解为特定代码的翻译官。
Mar23 23:17:43 ~
$ vim file1.sh
#1/bin/bash #即我就要根目录下的bin里面的bash来执行我的内容。
echo "Welcome to Biotrainee()"
更高级写法:根据具体环境应用bash,没有写死。
Mar23 23:36:17 ~
$ vim file1..sh
#1/usr/bin/env bash
echo "Welcome to Biotrainee()"
1:标准输出流 2:标准误输出流(程序出错的部分)
Mar23 23:49:14 ~
$ vim test.sh
Mar23 23:50:11 ~
$ cat test.sh
#!/usr/bin/env bash
pwd
pwd
ppp
1.不进行重定向,结果直接输出到标准输出流(屏幕)
Mar23 23:50:17 ~
$ bash test.sh
/trainee2/Mar23
/trainee2/Mar23
test.sh: line 4: ppp: command not found
2.进行重定向,但不指定标准输出和标准误输出,正确的在out.log中,错误的输出到标准输出流(屏幕),这样报喜不报忧的方式很危险,没有告你错在哪儿了。
Mar23 23:50:46 ~
$ bash test.sh > out.log
test.sh: line 4: ppp: command not found
Mar23 23:51:44 ~
$ cat out.log
/trainee2/Mar23
/trainee2/Mar23
3.进行分开重定向,正确与错误分别进入两个log文件。有点在于方便debug,缺点是有时候(介入脚本洗的不好)会失去上下文联系。
Mar23 23:51:53 ~
$ bash test.sh 1>out.log 2>error.log
Mar23 00:01:17 ~
$ cat out.log
/trainee2/Mar23
/trainee2/Mar23
Mar23 00:01:33 ~
$ cat error.log
test.sh: line 4: ppp: command not found
Mar23 00:01:36 ~
$ cat -n test.sh
1 #!/user/bin/env bash
2 pwd
3 pwd
4 ppp
4.进行分开重定向,将2输出到1中,两者都输出到out.log
Mar23 00:02:40 ~
$ bash test.sh 1>out.log 2>&1
Mar23 00:06:04 ~
$ cat out.log
/trainee2/Mar23
/trainee2/Mar23
test.sh: line 4: ppp: command not found
后缀.log也是瞎子打灯笼的原理,写log就知道它是日志文件,写其他比如jimmy也行,但是不方便你理解。.sh、.r、.py都是约定俗成的,只是叫别的你可能就不知道这是什么格式的文件。
Shell 脚本:修改shell脚本的文件权限后,可以全路径调用,不需要用bash。
为什么是124?因为0-7可以有这三个数字组合而成。太牛了~
Mar23 00:06:23 ~
$ ll test.sh
-rw-rw-r-- 1 Mar23 Mar23 33 Aug 24 23:50 test.sh
Mar23 00:19:09 ~
$ chmod 764 test.sh #change mode
Mar23 00:21:17 ~
$ ll test.sh
-rwxrw-r-- 1 Mar23 Mar23 24 Aug 25 00:21 test.sh*
Mar23 00:38:50 ~
$ ./test.sh #因为test.sh不在环境变量里(TAB不能补齐可以知道),或者说不在PATH里面,所以要写./ ,直接写test.sh会找不到命令。
Hi Welcome
修改为不可执行的:
Mar23 00:56:01 ~
$ chmod 664 test.sh
Mar23 01:01:01 ~
$ ll test.sh
-rw-rw-r-- 1 Mar23 Mar23 38 Aug 25 00:46 test.sh
Mar23 01:01:08 ~
$ ./test.sh
-bash: ./test.sh: Permission denied
Mar23 01:01:21 ~
$ ./test #此时不可以自动补齐,因为不可执行
Mar23 01:04:06 ~
$ bash test.sh #此时要借助bash执行。
Hi Welcome
参数传递
Mar23 01:04:19 ~
$ cat test2.sh
#!/usr/bin/env bash
cat $1
Mar23 01:08:40 ~
$ bash test2.sh readme.txt #因为1是readme.txt 的位置参数, test2.sh脚本本身的位置参数是0,后面一次类推。
Welcome to Biotrainee() !
This is your personal account in our Cloud.
Have a fun with it.
Please feel free to contact with me( email to jmzeng1314@163.com )
(http://www.biotrainee.com/thread-1376-1-1.html)
再加一个,写到100个命令都可以,但是>=10以上的位置参数要加{},这样写提高了更大的自由度。
Mar23 01:14:25 ~
$ vim test2.sh
#!/usr/bin/env bash
cat $1
echo "This is $0"
Mar23 01:14:14 ~
$ bash test2.sh readme.txt
Welcome to Biotrainee() !
This is your personal account in our Cloud.
Have a fun with it.
Please feel free to contact with me( email to jmzeng1314@163.com )
(http://www.biotrainee.com/thread-1376-1-1.html)
This is test2.sh
假如第一个参数位置没有文件,所以命令cat就显示了一个寂寞。
Mar23 01:15:21 ~
$ bash test2.sh
#显示虚空
cat要重定向,才会打一句就不打,不然就会打一句显示一句。
任务提交:
•nohup:不要挂断任务,即把任务提交到服务器上运行,通常与&连用
•& :任务后台运行,通常与nohup连用
•top :实时显示系统中各个进程的资源占用状况,按q退出;htop -u Mar35 更常用。
•ps:Process Status列出当前系统中运行的进程列表,一般加上–ef参数
•kill :杀掉进程,kill PID
cat 要重定向到一个文件才可以打印
Mar23 01:25:27 ~
$ cat sleep.sh
#!/usr/bin/env bash
for i in {1..500}
do
echo $i >> sleep.out
sleep 2s
done
Mar23 01:25:34 ~
$ bash sleep.sh
双击现在的窗口新建一个窗口,动态查看之前窗口的命令:
方法1、tail -f ,不加f则不能动态查看
Mar23 01:27:58 ~
$ tail -f sleep.out #ctrl+c退出
方法2、less
Mar23 01:28:43 ~
$ less sleep.out #shift+f 进入动态查看,ctrl+c退出动态查看,q退出命令。
关掉之前开的窗口(模拟断网),那么现在窗口ll后就不会实时显示了,因为我的命令时前台执行的,如果关掉了,就不会执行了。那我又不能守在电脑旁,又期盼网络连接一直正常,所以就挂后台。
Mar23 01:29:25 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out
Mar23 01:34:02 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out
Mar23 01:34:10 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out
Mar23 01:34:11 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out
挂后台:无论断开还是关掉,都可以正常运行
Mar23 01:34:12 ~
$ nohup bash sleep.sh &
[1] 22179
Mar23 01:38:19 ~
$ nohup: ignoring input and appending output to 'nohup.out' #这句不是报错,只是一句提醒,把你的所有输出存到nohup.out文件里面了。再按一下回车就回到正常了。
Mar23 01:39:41 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 942 Aug 25 01:40 sleep.out
Mar23 01:40:12 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 945 Aug 25 01:40 sleep.out
Mar23 01:40:14 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 948 Aug 25 01:40 sleep.out
做生信就像放羊。
htop -u Mar35
kill -9: 用第九种方式无条件杀命令(满清十大酷刑,这是最好的~)
Mar23 01:40:16 ~
$ ps -ef | grep "Mar23"
Mar23 22179 19799 0 01:38 pts/10 00:00:00 bash sleep.sh #找到这条进程的编号22179
Mar23 01:54:09 ~
$ kill -9 22179
Mar23 01:54:23 ~
$ ll sleep.out #查看这只羊是不是还在吃
-rw-rw-r-- 1 Mar23 Mar23 2723 Aug 25 01:55 sleep.out
[1]+ Killed nohup bash sleep.sh
Mar23 01:56:30 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 2864 Aug 25 01:56 sleep.out
Mar23 01:56:46 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 2867 Aug 25 01:56 sleep.out
Mar23 01:56:48 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 2870 Aug 25 01:56 sleep.out #竟然还在变,猜测还有没杀干净的。
用ps -ef | grep "Mar23"继续查看,发现还有一个sleep.out,没杀干净继续杀:
Mar23 01:56:49 ~
$ ps -ef | grep "Mar23"
Mar23 01:57:18 ~
$ kill -9 25304
Mar23 01:57:41 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 2968 Aug 25 01:57 sleep.out
Mar23 01:57:56 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 2968 Aug 25 01:57 sleep.out
Mar23 01:57:59 ~
$ ll sleep.out
-rw-rw-r-- 1 Mar23 Mar23 2968 Aug 25 01:57 sleep.out
1.阮一峰的bash脚本教程(纯计算机内容)https://wangdoc.com/bash/
2.鸟哥的Linux私房菜:基础学习篇第四版(第14章)https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/104.html
如何前台执行一个命令?
如何挂后台?
动态查看输出结果?
查看运行结果?top htop
如何找到编号并杀掉?(身份证号写到死亡笔记上面)