使用Ubuntu命令行软件
在桌面系统里面使用软件,我们一般是双击那个软件的图标,然后开始使用,使用好了之后就关闭。比如双击word,然后开始写文档,之后保存退出。在命令行里面,整个过程类似,但是在展现形式上有些区别,因为我们不再使用鼠标,所以都需要使用键盘键入文字来实现。实际上我们之前使用 vi的时候,就过了一遍命令行软件的使用流程。我们会使用一个关键词来调用(打开)那个软件 vi;然后我们会给这个关键词后面添加一些参数, vi.ssh/authorized_keys,这个就像是给word文档命名一样;之后我们会在软件中进行一系列操作;然后再保存退出。常用的软件一般就是,软件名 + 参数。退出软件的方法,不同的软件会有些许不同,不过大多都跟 q, contrl-C,esc 有关。下面是几个例子。
roden@ip-172-31-2-87:~$ ls / # ls 是软件名,list, / 是参数,"列出根目录 / 的内容" bin dev home initrd.img.old lib64 media opt root sbin srv tmp var vmlinuz.old boot etc initrd.img lib lost+found mnt proc run snap sys usr vmlinuz roden@ip-172-31-2-87:~$ ls /home # "列出目录 /home 的内容" roden ubuntu roden@ip-172-31-2-87:~$ vi test.txt # 新建文本文件 roden@ip-172-31-2-87:~$ ls # 如果不带参数,软件会使用默认参数,ls的默认参数就是当前文件夹 test.txt roden@ip-172-31-2-87:~$ cat test.txt # 连续(concatenate)打印文件内容 test content 测试内容 roden@ip-172-31-2-87:~$ mkdir test_folder # 新建文件夹 roden@ip-172-31-2-87:~$ cd test_folder/ # 进入到新文件夹 change directory roden@ip-172-31-2-87:~/test_folder$ pwd # 输出当前工作目录 /home/roden/test_folder roden@ip-172-31-2-87:~/test_folder$ cd # cd 不带参数时,默认是回到用户根目录 roden@ip-172-31-2-87:~$ pwd /home/roden roden@ip-172-31-2-87:~$ top # 显示目前各个进程耗用的资源(CPU,内存), 按 q 退出该软件 top - 21:55:37 up 1:31, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 121 total, 1 running, 120 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.1 sy, 0.1 ni, 99.4 id, 0.1 wa, 0.0 hi, 0.0 si, 0.1 st KiB Mem : 1014460 total, 586320 free, 48832 used, 379308 buff/cache KiB Swap: 0 total, 0 free, 0 used. 804348 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 37900 5872 3908 S 0.0 0.6 0:02.16 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H roden@ip-172-31-2-87:~$ top -u roden # 仅显示某个用户的进程, 按 q 退出 top - 21:57:18 up 1:32, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 121 total, 1 running, 120 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.1 sy, 0.1 ni, 99.4 id, 0.1 wa, 0.0 hi, 0.0 si, 0.1 st KiB Mem : 1014460 total, 586360 free, 48792 used, 379308 buff/cache KiB Swap: 0 total, 0 free, 0 used. 804392 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4181 roden 20 0 45248 4520 3820 S 0.0 0.4 0:00.00 systemd 4183 roden 20 0 61352 2076 0 S 0.0 0.2 0:00.00 (sd-pam) 4240 roden 20 0 95372 4040 3088 S 0.0 0.4 0:00.02 sshd 4243 roden 20 0 21388 5164 3232 S 0.0 0.5 0:00.03 bash 4299 roden 20 0 21388 5320 3376 S 0.0 0.5 0:00.04 bash 4387 roden 20 0 40520 3668 3080 R 0.0 0.4 0:00.00 top roden@ip-172-31-2-87:~$ free # 显示内存占用 total used free shared buff/cache available Mem: 1014460 48628 586504 3152 379328 804556 Swap: 0 0 0 roden@ip-172-31-2-87:~$ # 直接按回车什么都不执行 roden@ip-172-31-2-87:~$ free -h # -h 用人(human)方便阅读的方式显示大小,M,G等 total used free shared buff/cache available Mem: 990M 47M 572M 3.1M 370M 785M Swap: 0B 0B 0B
大家可以再回头看一看前面的教程,其实都是在使用各种软件。
安装命令行软件 - apt安装
在Win或其他桌面系统里面安装软件的时候,我们一般会下载一个软件安装包,然后设定一些选项,点击下一步,安装并使用。而在命令行里面,我们可以下载一个源码包,然后编译它,然后使用相应软件。不过大多数命令行系统都会有一个软件包管理器,就类似于是iPhone的App Store,它收集了很多软件,然后我们只需要输入一个命令就可以安装软件了(App Store有些App需要付费,而命令行软件包里的软件,大多都是开源软件,使用它们不需要付费)。在Ubuntu里面,常用的软件包管理器是Ubuntu's APT (Advanced Packaging Tool (高级包装工具)) 我们可以使用命令 apt 来调用这个包管理工具。下面我们以 htop这个类似于 top的软件为例,来讲解如何安装和卸载软件。
roden@ip-172-31-2-87:~$ htop # 尝试使用未安装的软件 The program 'htop' is currently not installed. You can install it by typing: # 系统提示没有 # 安装 sudo apt install htop # 提示可以使用这一行命令安装 roden@ip-172-31-2-87:~$ sudo apt install htop # 使用提示的命令行,安装 [sudo] password for roden: # 安装软件需要管理员权限,所以需要输入密码 Reading package lists... Done # 接下来的一些操作类似于下载,解压,安装软件 Building dependency tree Reading state information... Done The following NEW packages will be installed: htop 0 upgraded, 1 newly installed, 0 to remove and 26 not upgraded. # 这里提示,即将安装一个新软 # 件,系统中已存在的软件,有26个可以升级。就类似于App Store提示有多少App可以升级一样。 Need to get 76.4 kB of archives. # 安装这个软件需要下载多大的文件 After this operation, 215 kB of additional disk space will be used. # 安装成功之后会占用多少 # 存储 Get:1 http://us-west-2.ec2.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 htop amd64 2.0.1-1ubuntu1 [76.4 kB] # 下载 Fetched 76.4 kB in 0s (6,242 kB/s) Selecting previously unselected package htop. (Reading database ... 76537 files and directories currently installed.) Preparing to unpack .../htop_2.0.1-1ubuntu1_amd64.deb ... Unpacking htop (2.0.1-1ubuntu1) ... # 解压、安装、安装后的一些设置 Processing triggers for mime-support (3.59ubuntu1) ... Processing triggers for man-db (2.7.5-1) ... Setting up htop (2.0.1-1ubuntu1) ... roden@ip-172-31-2-87:~$ #当命令行再次回到等待指令的状态时,该软件就安装好了。
在Ubuntu16.04中只需要输入 sudo apt install SOFTWARE_NAME就可以安装软件了,而在老版的Ubuntu中,需要使用 sudo apt-get install SOFTWARE_NAME来安装。安装好了之后,我们就可以用前面讲的方法使用了。
roden@ip-172-31-2-87:~$ htop # 可以看到比 top 漂亮一些系统资源使用报告,按 q 退出 htop 软件 roden@ip-172-31-2-87:~$
删除apt软件 & 搜索资料
有时我们可能错误安装或者因为其他原因如磁盘空间不足想删除一些软件。如果是用apt安装的话,我们可以使用下面的方法来删除。有时我们可能不记得某一条命令是什么了,可以上网搜索。在网上搜索一个计算机问题的时候,推荐大家尽量使用谷歌英文搜索。如现在谷歌“ubuntu remove apt installed software”(搜索并不一定需要给出最好的词汇,接近即可,但更好的词汇会缩短获得答案的时间,这里使用”how to uninstall apt installed package“可能更好),第一条结果是"askubuntu"的,这是Stack Exchange (Stack Overflow)公司出的一个站点,里面的资料质量一般都很好。我一般看到该公司旗下站点的答案的时候就会直接仔细阅读。可以看到被采纳的答案是,使用 sudo apt-get remove <application_name>来删除该软件本身,使用 sudo apt-get purge <package-name>可以删除这个软件以及安装这个软件的时候附带安装的一些依赖软件(依赖软件就像,要学“高等线性代数二”就得先学“高等线性代数一“一样,有时要安装软件X,必须先安装软件ABC,而删除X的时候,可以选择只删除X,也可以选择同时删除ABC和X)。找到之后我们就可以尝试别人给的答案了。
roden@ip-172-31-2-87:~$ sudo apt purge htop # Ubuntu16.04 系统可以省略 apt-get 的 -get [sudo] password for roden: Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be REMOVED: htop* 0 upgraded, 0 newly installed, 1 to remove and 26 not upgraded. # 提示一个软件即将被删除 After this operation, 215 kB disk space will be freed. # 提示会腾出215kB的空间,这个和之前安装 # 的时候是一样的 Do you want to continue? [Y/n] # 询问是否继续 (Reading database ... 76546 files and directories currently installed.) Removing htop (2.0.1-1ubuntu1) ... Processing triggers for man-db (2.7.5-1) ... Processing triggers for mime-support (3.59ubuntu1) ... roden@ip-172-31-2-87:~$ htop # 当我们已经删除之后,再尝试就会提示未安装 The program 'htop' is currently not installed. You can install it by typing: sudo apt install htop
安装命令行软件 - 编译源码
有些软件在软件包管理器当中并没有,或者说并不是最新版的,这时如果我们想安装它们的话,就需要通过编译源码来安装了。这个过程有时复杂,有时简单,取决于有多少依赖项目需要预先安装。这里我以生物信息学中的一个软件 bwa 为例,说一下怎么通过源码安装。 bwa 是分析二代测序产生的基因序列时常用的一个软件,它的功能是把测序产生的基因序列片段和研究物种(如人)的参考基因组进行比对,寻找该片段在基因组的位置。首先我们谷歌搜索找到 bwa 的官方网页,https://github.com/lh3/bwa。然后根据它的提示,进行安装。
roden@ip-172-31-2-87:~$ git clone https://github.com/lh3/bwa.git # 下载软件 Cloning into 'bwa'... remote: Counting objects: 4071, done. remote: Total 4071 (delta 0), reused 0 (delta 0), pack-reused 4071 Receiving objects: 100% (4071/4071), 1.57 MiB | 0 bytes/s, done. Resolving deltas: 100% (2904/2904), done. Checking connectivity... done. roden@ip-172-31-2-87:~$ cd bwa; make # 根据官网提示,输入安装指令, 注意这里的第一句话,cd bwa # 就把工作目录转换到了 bwa 里面 The program 'make' can be found in the following packages: * make * make-guile Try: sudo apt install <selected package> # 提示我们没有make这个软件,并告诉我们该如何安装 roden@ip-172-31-2-87:~/bwa$ sudo apt install make # 根据提示安装 make [sudo] password for roden: Reading package lists... Done ... # 此处省略若干行输出 Setting up make (4.1-6) ... roden@ip-172-31-2-87:~/bwa$ cd bwa; make # 这里我继续用之前的指令执行,注意这里我们已经到bwa里 # 面了 -bash: cd: bwa: No such file or directory # 因为我们已经到bwa里面了,而该文件夹里面没有另外一个 # 叫bwa的文件夹,所以会提示找不到文件或文件夹 gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS utils.c -o utils.o make: gcc: Command not found # 这里提示没有gcc,gcc是一个软件,c语言编译器 Makefile:25: recipe for target 'utils.o' failed make: *** [utils.o] Error 127 roden@ip-172-31-2-87:~/bwa$ gcc # 尝试使用gcc The program 'gcc' is currently not installed. You can install it by typing: sudo apt install gcc roden@ip-172-31-2-87:~/bwa$ sudo apt install gcc # 根据提示安装gcc Reading package lists... Done Building dependency tree Reading state information... Done ... # 此处省略若干行输出 Setting up libc6-dev:amd64 (2.23-0ubuntu7) ... Setting up manpages-dev (4.04-2) ... Processing triggers for libc-bin (2.23-0ubuntu7) ... roden@ip-172-31-2-87:~/bwa$ make # 接着根据官网提示,省略cd bwa,只执行 make gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS utils.c -o utils.o utils.c:33:18: fatal error: zlib.h: No such file or directory # 报错,下文有如何寻找解决方案的说明。这是缺少一个依赖项 compilation terminated. Makefile:25: recipe for target 'utils.o' failed make: *** [utils.o] Error 1 roden@ip-172-31-2-87:~/bwa$ sudo apt-get install libz-dev # 在stackoverflow上找到的解决方法 [sudo] password for roden: Reading package lists... Done Building dependency tree Reading state information... Done Note, selecting 'zlib1g-dev' instead of 'libz-dev' The following additional packages will be installed: zlib1g The following NEW packages will be installed: zlib1g-dev The following packages will be upgraded: zlib1g 1 upgraded, 1 newly installed, 0 to remove and 25 not upgraded. ... Preparing to unpack .../zlib1g-dev_1%3a1.2.8.dfsg-2ubuntu4.1_amd64.deb ... Unpacking zlib1g-dev:amd64 (1:1.2.8.dfsg-2ubuntu4.1) ... Processing triggers for man-db (2.7.5-1) ... Setting up zlib1g-dev:amd64 (1:1.2.8.dfsg-2ubuntu4.1) ... roden@ip-172-31-2-87:~/bwa$ # 回到等待指令的状态,上面也没有报错error,说明成功安装了一个依赖 # 项。 roden@ip-172-31-2-87:~/bwa$ make # 再次执行安装指令 make gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS utils.c -o utils.o # 编译过程中的一些输出 gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS kthread.c -o kthread.o gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS kstring.c -o kstring.o gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS ksw.c -o ksw.o ... bwt_gen.c: In function 'BWTIncBuildRelativeRank’: bwt_gen.c:878:10: warning: variable 'oldInverseSa0RelativeRank’ set but not used [-Wunused-but-set-variable] # 有时编译的时候会看到Warning,有很多原因,有一部分跟程序的代码写的不完善有关, # 一般只要不是Error,就都还好。 bgint_t oldInverseSa0RelativeRank = 0; ^ bwt_gen.c: In function 'BWTIncMergeBwt’: bwt_gen.c:952:15: warning: variable 'bitsInWordMinusBitPerChar’ set but not used [-Wunused-but-set-variable] unsigned int bitsInWordMinusBitPerChar; ... gcc -c -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS main.c -o main.o gcc -g -Wall -Wno-unused-function -O2 -DHAVE_PTHREAD -DUSE_MALLOC_WRAPPERS bwashm.o bwase.o bwaseqio.o bwtgap.o bwtaln.o bamlite.o bwape.o kopen.o pemerge.o maxk.o bwtsw2_core.o bwtsw2_main.o bwtsw2_aux.o bwt_lite.o bwtsw2_chain.o fastmap.o bwtsw2_pair.o main.o -o bwa -L. -lbwa -lm -lz -lpthread -lrt roden@ip-172-31-2-87:~/bwa$ # 回到等待指令的状态,上面也没有报错error,说明成功安装了bwa这个软件 roden@ip-172-31-2-87:~/bwa$ ./bwa # 测试bwa,下面输出了帮助文档,说明安装成功了。这里我们是通过 # 输入该软件的路径,"./bwa"来执行bwa这个软件,而不像之前直接top,就可以执行top了。这是因为bwa不在 # 我们系统的环境变量里面。把一个路径添加到系统的环境变量还是经常用到的,感兴趣的朋友可以自行搜索一 # 下。 Program: bwa (alignment via Burrows-Wheeler transformation) Version: 0.7.15-r1142-dirty Contact: Heng Li <lh3@sanger.ac.uk> Usage: bwa <command> [options] Command: index index sequences in the FASTA format mem BWA-MEM algorithm fastmap identify super-maximal exact matches pemerge merge overlapping paired ends (EXPERIMENTAL) aln gapped/ungapped alignment samse generate alignment (single ended) sampe generate alignment (paired ended) bwasw BWA-SW for long queries shm manage indices in shared memory fa2pac convert FASTA to PAC format pac2bwt generate BWT from PAC pac2bwtgen alternative algorithm for generating BWT bwtupdate update .bwt to the new format bwt2sa generate SA from BWT and Occ Note: To use BWA, you need to first index the genome with `bwa index'. There are three alignment algorithms in BWA: `mem', `bwasw', and `aln/samse/sampe'. If you are not sure which to use, try `bwa mem' first. Please `man ./bwa.1' for the manual.
中间我们遇到好几个错误“Error”,如果大家理解错误的原因,就能很快处理它。我刚开始学习Linux的时候,每次遇到错误,都很烦躁,一般会重头再来一遍,然后还是一样的错误;中文搜索一下,解决不了;有时错误就摆在那里了;到后来就非常害怕遇到错误“Error”。只到我开始阅读英文的提示,才发现,原来大多数错误都是可以很快被解决的,而且所有的Error都给了原因,很多也都给了解决办法。比如上面,很多都是没有安装相应软件导致的。如: make , gcc等。但是有一个错误,“fatal error: zlib.h: No such file or directory”,没有给提示,也不是没有软件的原因,初次看到可能不理解,我们可以把带有"Error"的那一行放到谷歌里面看看。
第一个结果是stackoverflow上的,前面已经说过,这里面的答案的质量一般都很高,应该花时间仔细阅读一下。之后,应该能理解我们是缺少一个叫“zlib.h”的头文件,这个是编译这个软件的一个依赖项,所以我们要先安装它。根据答案,我们可以通过这一行命令来安装它 sudo apt-get install libz-dev 。之后,问题就解决了, bwa 也成功安装了。最后,我们提到了“把一个路径添加到系统的环境变量还是经常用到的,感兴趣的朋友可以自行搜索一下”。这个并不是太难,在后面的教程中,我们用到这个的时候,会简单讲一讲。
推荐阅读
- Linux/Unix 命令行入门教程,UNIX Tutorial for Beginners 这个是我当时上计算生物学的一节课时老师让大家跟的教程,大家可以找对应的中文版的。如果是想学的非常深,推荐阅读《鸟哥的Linux私房菜》这本书。
- 搜索“设置Linux环境变量”,“set PATH in Ubuntu for user”,https://ask/questions/60218/how-to-add-a-directory-to-the-path
集锦卡
多用户管理
$ sudo adduser USER_NAME # 添加用户 $ su - USER_NAME # 切换用户 $ sudo usermod -g admin USER_NAME # 添加用户到超级用户组
SSH密钥对登录服务器
# 本节的命令在本地电脑上完成 $ ssh-keygen # 生成ssh密钥对 $ cat ~/.ssh/tutorial_rsa.pub # 查看公有密钥
在远端服务器
$ mkdir .ssh # 新建名为“.ssh”的文件夹 $ chmod 700 .ssh/ # 更改文件夹权限。 $ vi .ssh/authorized_keys #使用vim 新建一个文件,并把之前复制的公有密钥复 # 制进去。 $ chmod 600 .ssh/authorized_keys #更改这个文件的权限为只有自己“可读可写”
运行命令行软件
$ cat test.txt # 连续(concatenate)打印文件内容 $ mkdir test_folder # 新建文件夹 $ cd test_folder/ # 进入到新文件夹 change directory $ pwd # 输出当前工作目录 $ cd # cd 不带参数时,默认是回到用户根目录 $ top # 显示目前各个进程耗用的资源(CPU,内存), 按 q 退出该软件 $ top -u USER_NAME # 仅显示某个用户的进程, 按 q 退出 $ free # 显示内存占用 $ free -h # -h 用人(human)方便阅读的方式显示大小,M,G等
apt安装删除软件
$ sudo apt install htop # 安装软件htop $ htop # 使用 htop 可以看到比 top 漂亮一些系统资源使用报告,按 q 退出 htop 软件 $ sudo apt purge htop # 删除软件及其依赖包
编译软件源码
$ git clone https://github.com/lh3/bwa.git # 下载软件 $ cd bwa; make The program 'make' can be found in the following packages: * make * make-guile $ sudo apt install make # 根据提示安装 make $ gcc # 尝试使用gcc The program 'gcc' is currently not installed. You can install it by typing: $ sudo apt install gcc # 根据提示安装gcc $ make # 接着根据官网提示,省略cd bwa,只执行 make utils.c:33:18: fatal error: zlib.h: No such file or directory # 报错,下文有如何寻找解决方案的说明。这是缺少一个依赖项 $ sudo apt-get install libz-dev # 在stackoverflow上找到的解决方法 $ make # 再次执行安装指令 make $ ./bwa # 测试bwa