本文面向Tanglab及类似的需要使用Linux、但缺乏相关基础的科研人士

本文基于《**TLCL 快乐的 Linux 命令行》** ,计划每周给实验室同学普及一些linux常识。如果你希望深入学习,应当阅读原文。

如果你拥有丰富的经验,基础内容对你的帮助可能比较有限,但扩展内容应该能给你一些有益的启发。

基础命令行

基础内容: 重定向,echo;扩展内容:modern-unix

在上一篇《Tutorial:从零开始的Linux使用【1】》中,我们对linux的基础交互——shell与Terminal的使用,以及进行基础文件的操作进行了介绍。下面,我们将对linux中可能没那么频繁使用、但作为基础难以离开的命令行进行介绍。

重定向

在linux中,程序的运行结果输送到一个叫做标准输出的特殊文件(经常用 stdout 表示),而它们的状态信息则送到另一个 叫做标准错误输出的文件(stderr)。默认情况下,标准输出和标准错误输出都连接到屏幕,而不是保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下, 标准输入连接到键盘。而I/O 重定向允许我们更改输出地点和输入来源。一般来说,输入来自键盘,输出送到屏幕, 但是通过 I/O 重定向,我们可以做出改变。

关于重定向,下面的例子能较好地说明:

# 键盘输入,屏幕输出
ls -l /usr/bin
# 将输出重定向到特定文件(替换模式)
ls -l /usr/bin > ls-output.txt
# 清空文件(将空白内容写入文件)
> ls-output.txt
# 将输出重定向到特定文件(增量模式,不替换原有文件)
ls -l /usr/bin >> ls-output.txt
# 将输出和错误报告重定向到特定文件
## “2>&1” 代表重定向文件描述符2(标准错误输出)到文件描述符1(标准输出)
ls -l /bin/usr > ls-output.txt 2>&1
## bash 下也可以写成
ls -l /bin/usr &> ls-output.txt
# 丢掉(不显示)错误报告
ls -l /bin/usr 2> /dev/null
## /dev/null是系统设备,叫做数字存储桶,它可以 接受输入,并且对输入不做任何处理

如果你对上面的内容无法理解,可以自己试一试,或者阅读原文 来深入学习,不过对大多数人来说,下面的代码就够使用了:

nohup <yourcode> &> nohup.out &
## 或者等效的写法
nohup <yourcode> >nohup.out 2>&1 &
## 它的意思是说把代码的输出和错误都输出到当前目录下的nohup.out文件中,并且后台运行(最后的“&”)。
## 但如果你了解了重定向的写法和功能,就能在这基础上做你需要的修改。

很多时候,我们还希望把另一个代码的输出作为输入运行下一个代码,这里就需要用到管道线“|”,它在平时十分常用:

command1 | command2
# 常用的形式比如:
## 显示带有特定关键词的进程,grep 是个很强大的程序,用来找到文件中的匹配文本
ps aux | grep <tag> 
## 杀死所有带有特定关键词的进程
ps -ef |grep <tag>  |awk '{print $2}'|xargs kill -9

这样,你就对重定向有一定了解了,简单来说无非是用好“|”进行输入和用“>”进行输出。在实际linux使用中,二者还是相当实用的,例如:

history | grep cd
nohup <yourcode> >nohup.out 2>&1 &