由于单细胞 RNA 测序(scRNA-seq)的上游数据处理(从 FastQ 原始序列到 Count Matrix 表达矩阵转换),以及全基因组测序(WGS)和全外显子组测序(WES)的数据分析,均需要在 Unix/Linux 系统环境下通过 Bash 命令行界面(Terminal)完成。因此,这个板块下的内容将重点介绍基础的 Bash 命令,帮助学习者掌握基础的 Bash 的编程语法与交互逻辑。
本 Linux 教程共分为 13 个章节
man 手册充分利用所学的 Linux 命令。我们首先从命令行开始
命令行(Command Line)或终端(Terminal)是一个基于文本的系统界面。你可以通过键盘输入命令,系统则同样以文本形式向你提供反馈。
命令行通常会呈现一个提示符(Prompt)。当你输入时,内容会显示在提示符之后。大多数情况下,你都在发布指令。以下是一个示例:
1 2 3 4 5 6
user@bash: ls -l /home/ryan
total 3
drwxr-xr-x 2 ryan users 4096 Mar 23 13:34 bin
drwxr-xr-x 18 ryan users 4096 Feb 17 09:12 Documents
drwxr-xr-x 2 ryan users 4096 May 05 17:25 public_html
user@bash:
让我们对其进行拆解分析:
user@bash)。在提示符之后,我们输入了一个命令(ls)。通常情况下,**命令(Command)**总是你输入的第一个内容。-l /home/ryan。-l)也被称为选项(Option)。选项通常用于修改命令的行为,一般位于其他参数之前,并以短横线(-)开头。ls (List):-l (long listing format): 选项参数。使输出以“长格式”显示,包含权限、所有者、文件大小和修改时间等详细信息。
/home/ryan: 位置参数。指定要列出的目标目录路径。
打开终端的操作非常简单。虽然不同系统的具体操作路径有所差异,但你可以参考以下几种常见方式:
Command (⌘) + Space 唤起 Spotlight 搜索,输入 "Terminal" 即可快速找到并打开。ssh 命令进行远程连接。在终端内部,运行着一个被称为 Shell(壳层) 的程序。它是操作系统的一部分,负责定义终端的行为,并处理指令的运行(或执行)。
目前有多种不同的 Shell 可供选择,但最常用的一种名为 BASH,其全称为 Bourne Again SHell。本教程将假定你使用 BASH 作为默认 Shell。
如果你想确认当前正在使用哪种 Shell,可以使用 echo 命令来显示存储当前 Shell 信息的系统变量。echo 是一个用于显示文本消息或变量值的命令。
1 2 3
MichaelYMXs-Laptop:~ michaelyangmingxu$ echo $SHELL
/bin/bash
MichaelYMXs-Laptop:~ michaelyangmingxu$
Image showing the layered structure of Hardware -> Kernel -> Shell -> User
代码解释
echo:$SHELL: 这是一个环境变量,存储了当前登录用户所使用的 Shell 的路径(例如 /bin/bash 或 /bin/zsh)。在 Linux 中,引用变量时通常需要在变量名前加上 $ 符号。.bashrc 与 .zshrc)及其语法可能略有差异。终端起初可能令人望而生畏,但不必担心。Linux 充满了各种旨在简化操作的快捷方式。在本教程中,你将陆续接触到其中的许多技巧。请务必留意它们,因为这些快捷方式不仅能提高效率,还能有效避免因拼写错误(Typos)导致的低级失误。
这是你的第一个快捷方式:当你输入命令时,它们实际上被存储在一个历史记录 (History) 中。
↑ 和 ↓ 键来遍历历史记录。因此,无需重复输入之前运行过的命令,只需按几次上箭头即可。← 和 → 键移动光标,对调出的历史命令进行编辑。历史记录在不同的会话(Sessions)之间也是被保留的,这意味着你可以回溯很久以前输入的命令。通常情况下,系统会默认记住你最近输入的 1000 条命令。
如果你想知道你的系统当前设置记忆多少条命令,可以使用 echo 命令来显示相关的系统变量。
1 2 3
MichaelYMXs-Laptop:~ michaelyangmingxu$ echo $HISTSIZE
500
MichaelYMXs-Laptop:~ michaelyangmingxu$
代码解释
echo:$HISTSIZE:bwa mem 比对或 freebayes 变异检测)时,通过历史记录找回复杂的命令参数可以极大减少手动输入的错误率。如果你发现历史记录不够用,可以在 .bashrc 文件中修改此变量。在本章节中,我们将学习在系统中移动的基础知识。许多任务都依赖于能够准确到达或引用系统中的正确位置。因此,这些内容构成了在 Linux 中高效工作的基石。
我们要学习的第一个命令是 pwd,全称为 Print Working Directory(打印当前工作目录)。你会发现 Linux 中的许多命令都是其功能描述单词的缩写,这使得它们更容易被记住。
该命令的功能正如其名:它会告诉你当前正处于哪个工作目录。终端上的许多命令都依赖于你处于正确的位置。当你移动时,很容易忘记自己当前的位置。请经常使用此命令,以提醒自己当前所处的位置。
1 2 3
MichaelYMXs-Laptop:~ michaelyangmingxu$ pwd
/Users/michaelyangmingxu
MichaelYMXs-Laptop:~ michaelyangmingxu$
了解我们所处的位置只是第一步。接下来,我们需要知道该位置包含什么内容。用于此任务的命令是 ls,它是 list(列出)的缩写。
1 2 3 4 5 6 7 8
MichaelYMXs-Laptop:~ michaelyangmingxu$ ls
Applications Movies
Charité - Universitätsmedizin Berlin Music
Desktop Pictures
Documents Public
Downloads Zotero
Library
MichaelYMXs-Laptop:~ michaelyangmingxu$
与通常单独运行且不带参数的 pwd 不同,ls 功能更强大。在上面的示例中,我们在不带参数的情况下运行它,此时它仅列出当前位置的内容。此外,我们还可以对 ls 进行更多操作。以下是其用法大纲:
1
ls [options] [location]
在上述示例中,方括号([])表示这些项是可选的,我们可以在运行命令时包含或不包含它们。在下面的终端示例中,我以几种不同的方式运行了 ls 以进行演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
user@bash: ls
bin Documents public_html
user@bash: ls -l
total 3
drwxr-xr-x 2 ryan users 4096 Mar 23 13:34 bin
drwxr-xr-x 18 ryan users 4096 Feb 17 09:12 Documents
drwxr-xr-x 2 ryan users 4096 May 05 17:25 public_html
user@bash: ls /etc
a2ps.cfg aliases alsa.d cups fonts my.conf systemd
...
user@bash: ls -l /etc
total 3
-rwxr-xr-x 2 root root 123 Mar 23 13:34 a2ps.cfg
-rwxr-xr-x 18 root root 78 Feb 17 09:12 aliases
drwxr-xr-x 2 ryan users 4096 May 05 17:25 alsa.d
...
让我们分步解析:
ls。它列出了当前目录的内容。-l)的 ls,这表示我们将进行长格式列表(long listing)。长格式列表包含以下内容:-)还是目录(d)。ryan)。users)。/etc)的 ls。这样做是告诉 ls 不要列出当前目录,而是列出指定目录的内容。/etc 目录进行了长格式列表显示。在之前的命令中,我们开始接触到所谓的“路径”。现在我想更详细地探讨它们,因为掌握路径是熟练使用 Linux 的关键。每当我们在命令行中引用文件或目录时,实际上就是在引用一个路径。也就是说,路径是在系统中到达特定文件或目录的途径。
绝对路径与相对路径 (Absolute and Relative Paths)
我们可以使用两种类型的路径:绝对路径和相对路径。无论引用文件还是目录,我们都在使用其中之一。事实上,对于任何目标,这两种路径都可以使用(无论哪种方式,系统最终都会指向相同的位置)。
首先,我们需要理解 Linux 下的文件系统是一个层级结构。该结构的顶层被称为根目录(root directory),用单个正斜杠(/)表示。它拥有子目录,子目录又有自己的子目录,依此类推。文件可以存在于这些目录中的任何一个。
/)开头。以下是一个演示示例:
Bash
1 2 3 4 5 6 7 8 9 10
user@bash: pwd
/home/ryan
user@bash: ls Documents
file1.txt file2.txt file3.txt
...
user@bash: ls /home/ryan/Documents
file1.txt file2.txt file3.txt
...
pwd 以确认当前所在位置。ls 并提供了一个相对路径。Documents 是当前位置下的一个目录。该命令的结果取决于我们当前在哪里。如果系统中还有另一个用户 bob,且我们在他的家目录下运行此命令,那么我们将列出他的 Documents 目录内容。ls 并提供了一个绝对路径。无论运行命令时我们身处何处,该命令都会提供相同的输出。示例:
1 2 3 4 5 6 7
MichaelYMXs-Laptop:~ michaelyangmingxu$ pwd
/Users/michaelyangmingxu
MichaelYMXs-Laptop:~ michaelyangmingxu$ ls /Users/michaelyangmingxu/Documents
c8411ee5d976e37c R tutorial 德国其他文件
EndNote scRNA 硕士期间文件
python 博士相关材料
MichaelYMXs-Laptop:~ michaelyangmingxu$
你会发现,Linux 中的许多任务都可以通过多种不同的方式完成。路径也不例外。以下是一些可以帮助你构建路径的更多“构建块”:
~ (波浪号):这是你的家目录 (home directory) 的快捷方式。例如,如果你的家目录是 /home/ryan,那么你可以使用 /home/ryan/Documents 或 ~/Documents 来引用 Documents 目录。. (点):这是对当前目录的引用。例如,在之前的示例中,我们通过相对路径引用了 Documents。它也可以写作 ./Documents(通常这部分额外的符号不是必须的,但在后续章节中我们会看到它的用处)。.. (点点):这是对上级目录(父目录)的引用。你可以在路径中多次使用它以不断向上追溯层级。例如,如果你处于 /home/ryan 路径下,运行 ls ../../ 将会列出根目录的内容。现在你可能已经发现,我们可以用多种不同的方式引用同一个位置。你可能会问:我应该使用哪一个?答案是:你可以使用任何你喜欢的方法。每当你在命令行引用文件或目录时,你实际上是在引用一个路径,而你的路径可以用这些元素中的任何一个来构建。最好的方法就是对你来说最方便的那种。
以下是一些示例:
Bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
user@bash: pwd
/home/ryan
user@bash: ls ~/Documents
file1.txt file2.txt file3.txt
...
user@bash: ls ./Documents
file1.txt file2.txt file3.txt
...
user@bash: ls /home/ryan/Documents
file1.txt file2.txt file3.txt
...
user@bash: ls ../../ #向上返回两个上级目录,这里等于根目录
bin boot dev etc home lib var
...
user@bash: ls / #列出根目录
bin boot dev etc home lib var
...
在命令行中亲自尝试这些操作后,它们会变得更容易理解。请确保你理解了构建路径的所有这些元素,因为你在未来的章节中都会用到它们。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
MichaelYMXs-Laptransform: translateY(~ michaelyangmingxu$ pwd
/Users/michaelyangmingxu
MichaelYMXs-Laptop:~ michaelyangmingxu$ ls ~/Documents
c8411ee5d976e37c R tutorial 德国其他文件
EndNote scRNA 硕士期间文件
python 博士相关材料
MichaelYMXs-Laptop:~ michaelyangmingxu$ ls ./Documents
c8411ee5d976e37c R tutorial 德国其他文件
EndNote scRNA 硕士期间文件
python 博士相关材料
MichaelYMXs-Laptop:~ michaelyangmingxu$ ls ../../
Applications etc private Users
bin home sbin usr
cores Library System) var
dev opt tmp Volumes
MichaelYMXs-Laptransform: translateY(~ michaelyangmingxu$ ls /
Applications etc private Users
bin home sbin usr
cores Library System) var
dev opt tmp Volumes
MichaelYMXs-Laptop:~ michaelyangmingxu$
为了在系统中移动,我们使用一个名为 cd 的命令,它代表 change directory(切换目录)。其工作原理如下:
1
cd [location]
如果你在不带任何参数的情况下运行 cd 命令,它始终会带你回到你的家目录。
正如我们在上面的快捷方式中所看到的,cd 命令可以在不指定位置的情况下运行,但通常运行时会带有一个命令行参数,即我们想要切换到的位置。该位置以路径的形式指定,因此可以使用绝对路径或相对路径,并配合前面提到的任何路径构建块。以下是一些示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
MichaelYMXs-Laptransform: translateY(~ michaelyangmingxu$ pwd
/Users/michaelyangmingxu
MichaelYMXs-Laptop:~ michaelyangmingxu$ cd Documents
MichaelYMXs-Laptop:Documents michaelyangmingxu$ ls
c8411ee5d976e37c R tutorial 德国其他文件
EndNote scRNA 硕士期间文件
python 博士相关材料 运动
MichaelYMXs-Laptop:Documents michaelyangmingxu$
MichaelYMXs-Laptop:Documents michaelyangmingxu$ cd /
MichaelYMXs-Laptop:/ michaelyangmingxu$ pwd
/
MichaelYMXs-Laptop:/ michaelyangmingxu$ ls
Applications etc private Users
bin home sbin usr
cores Library System) var
dev opt tmp Volumes
MichaelYMXs-Laptop:/ michaelyangmingxu$
MichaelYMXs-Laptop:/ michaelyangmingxu$ cd ~/Documents
MichaelYMXs-Laptop:Documents michaelyangmingxu$ pwd
/Users/michaelyangmingxu/Documents
MichaelYMXs-Laptop:Documents michaelyangmingxu$ cd ../../
MichaelYMXs-Laptop:Users michaelyangmingxu$ pwd
/Users
MichaelYMXs-Laptop:Users michaelyangmingxu$ cd
MichaelYMXs-Laptop:~ michaelyangmingxu$ pwd
/Users/michaelyangmingxu
MichaelYMXs-Laptop:~ michaelyangmingxu$
Tab 键补全 (Tab Completion)
输入这些路径可能会变得很乏味。如果你和我一样,还容易输入错误。命令行有一个非常棒的机制可以帮到我们,它叫作 Tab 键补全。
当你开始输入路径时(在命令行的任何地方都可以,不限于特定命令),你可以随时按键盘上的 Tab 键,这将触发自动补全动作。如果按了没反应,说明存在多种可能性。此时如果你再按一次 Tab 键,它会列出所有可能的选项。然后你可以继续输入并再次按 Tab 键,它会再次尝试为你自动补全。
这在书面上很难演示,所以你最好亲自尝试一下。如果你开始输入 cd /h 然后按 Tab 键,接着输入你用户名的开头并再按 Tab 键,你就会感觉到它是如何工作的了。
| 命令/概念 | 完整名称 | 功能描述 |
|---|---|---|
pwd | 打印当前工作目录 | |
ls | 列出目录内容 | |
cd | 切换目录 | |
| 相对路径 | 相对位置 | |
| 绝对路径 | 绝对位置/) 开始引用的完整位置。 |
/etc - 存储系统的配置文件。/var/log - 存储各种系统程序的日志文件。(你可能没有权限查看该目录下的所有内容,但这不应阻止你的探索。看到一些错误提示并无大碍。)/bin - 存放若干常用程序的路径(其中一些程序我们将在本教程后续部分学到)。/usr/bin - 系统中另一个存放程序的路径。
1 2 3 4 5 6 7
MichaelYMXs-Laptransform: translateY(~ michaelyangmingxu$ cd ../../
MichaelYMXs-Laptop:/ michaelyangmingxu$ ls
Applications etc private Users
bin home sbin usr
cores Library System) var
dev opt tmp Volumes
MichaelYMXs-Laptop:/ michaelyangmingxu$
回到家目录的 4 种方法
cdcd 命令在不加任何参数时,默认目标是用户环境变量中的 $HOME。cd ~cd $HOMEcd /home/username(需替换为你的实际用户名)Tab 键
GCA_000001405.15_GRCh38_no_alt_analysis_set.fna 这样冗长的参考基因组文件名时,Tab 键能确保文件名输入百分之百准确,避免因肉眼难以察觉的拼写错误导致数小时的比对任务失败。This document is based on the original tutorial written by Ryan at https://ryanstutorials.net/linuxtutorial/.
All credit for the original content belongs to the original author.
This translated and summarized version is shared for educational purposes only.
It may not be used for any commercial purpose, including but not limited to paid courses, subscription-based content, monetized platforms, or any other commercial distribution.