← 返回模块
3.6.1.1beta 可读 · 未来免费校验通过内容版本 2026-05-27

文件系统、权限与 Shell 环境

3.6.1 · 面向量化开发的 Linux 与 Shell · 编程

周一上午九点,一家做 A-股 量化的 私募 把研究机的账号交到你手上。你 ssh 上去,屏幕上只有一行 quant@research-cn:~$。在能跑回测之前,你必须先知道:数据文件在哪个目录、谁能读谁能写、python 这个名字到底解析到 /opt/conda/envs/quant311/bin/python 还是别的什么东西。这一课就把这层「底座」交给你;后面三课会假设你已经能闭着眼睛在 Linux 研究机 上找到自己的家目录。

文件系统布局:一台研究机的样子

POSIX 文件系统从一个 /(根目录)开始向下展开。一台典型的 量化研究机 你会看到这几个目录:

  • / — 根目录,全部其它路径都挂在它下面。
  • /home/<user> — 你的家目录,等价写法是 ~cd ~ 永远回家。
  • /data/mnt/data — 共享的市场数据挂载点,通常是 NFS:研究侧只读、落地任务可写。本机上你会看到 /data/market-data/cn/equity/daily/(A-股 日 bar,只读)、/data/market-data/cn/equity/tick/(tick 文件,只读)。
  • /opt — 厂商或团队预装的软件。你的 Python 来自 /opt/conda/envs/quant311/
  • /tmp — 临时盘,重启就清空。任何重要东西都不要留在这里。
  • /var/log — 系统与应用日志。
  • /etc — 系统配置。

绝对路径以 / 开头,从根算起;相对路径以 .(当前目录)、..(上级目录)或一个裸名字开头,从工作目录算起。pwd 打印当前工作目录;cd /data/market-data/cn/equity/daily/ 跳到那里;cd ~ 回家;cd - 跳回上一次 cd 来之前的目录——加班调试时这一招省你十几次重输路径。

读懂 ls -lah

ls 一个目录会给你文件名;ls -l 会多出权限、所属、大小、时间;-a 把以 . 开头的隐藏文件也列出来;-h 把字节数写成 K / M / G 这种人类可读形式。三个开关一起用是日常默认。

$ ls -lah /data/market-data/cn/equity/daily/
-rw-r--r--  1 quant research  3.2M Apr 24 15:32 bars_510300_20250424.csv.gz
-rw-r--r--  1 quant research  2.8M Apr 24 15:32 bars_510500_20250424.csv.gz
-rw-r--r--  1 quant research  1.9M Apr 24 15:32 bars_510050_20250424.csv.gz

每一行从左到右是这样读的:第一个字符是文件类型——- 普通文件、d 目录、l 符号链接(symlink,指向另一个 inode 的别名)。接下来九个字符是三组三元组:用户(u)、组(g)、其他(o),每组依次是 r(读)、w(写)、x(执行;目录上则是「能不能进入」)。rw-r--r-- 翻译过来就是:所有者读写,组只读,其他只读。然后是链接计数(1 代表只有一个目录项指向它)、所有者(quant)、所属组(research)、人类可读大小、修改时间,最后才是文件名。

cp / mv / rm:Linux 没有回收站

cp src dst 复制,mv src dst 移动或改名,rm file 删除。这里有一条要刻进肌肉记忆的纪律:​​Linux 没有回收站​​。rm 立即从文件系统里抹掉文件,rm -rf <path> 递归删除目录、不需要确认。大多数研究机上最常见的事故就是 rm -rf $DIRDIR 是空的——这一行会展开成 rm -rf /,把根目录递归扫掉。对策是养成两步习惯:先 ls -lah <path> 确认你正要删的就是你想删的,再敲 rm -rf <path>

权限:chmodchownumask

文件模式(file mode)可以用符号或八进制两种方式来设置。符号形式 chmod u+x,g-w,o=r file 是「给用户加执行、去掉组写、其他改成只读」。八进制形式更紧凑:每一位是三位二进制(r=4, w=2, x=1)的总和,0644 就是 rw-r--r--0755 就是 rwxr-xr-x0700 就是 rwx------0600 就是 rw-------

chmod 0600 ~/.ssh/id_ed25519
chmod 0700 ~/.ssh
chmod 0644 /tmp/example.csv

chown user:group file 改所有者和组;chgrp group file 只改组。umask 是「默认拒绝掩码」(default-deny mask):新文件的最终模式是 0666 & ~umask、新目录是 0777 & ~umask。多数 量化团队 的 研究机 默认 umask 0022(即新文件 0644、新目录 0755);共享数据落地脚本会显式 umask 0027 以禁止 other 写入。

要记住两条 SSH 权限纪律:私钥(~/.ssh/id_ed25519 等)必须 0600,否则 ssh 拒绝使用;~/.ssh/ 目录本身必须 0700authorized_keys 也得是 0600。SSH 这么严格不是吓你——一个 world-readable 的私钥等价于把家钥匙挂在小区门口。

Shell 环境变量与 $PATH

Shell 是你和内核之间的胶水层。它维护一组环境变量(environment variable),子进程(每个你启动的程序)都继承这一组。常用的几个:

echo $HOME
echo $USER
echo $PATH
which python
command -v python
export RESEARCH_DATA=/data/market-data
echo $RESEARCH_DATA

$PATH 是一个用冒号分隔的目录列表;当你敲一个裸命令名(例如 python),shell 从左到右遍历 $PATH 列出的目录,找到的第一个可执行文件就是要跑的那一个。which python 与更可移植的 command -v python 都告诉你具体跑的是哪个二进制。如果你 export PATH=/opt/conda/bin:$PATH,那 /opt/conda/bin/python 会被先找到,覆盖系统默认的 /usr/bin/python

export VAR=value 把变量写入环境,子进程能看到;VAR=value cmd 只对这一条命令暴露;unset VAR 移除。注意 = 两边不能有空格——VAR = value 会被解析成「运行命令 VAR,参数是 =value」。

启动文件:~/.bashrc~/.profile

每开一个新终端,bash 会按规则读一组启动文件。常用规则可以记成两条:

  • ~/.bashrc 在每个​​交互 shell​​(interactive shell)启动时被 source。这里写别名(alias ll='ls -lah')、提示符自定义、shell 选项——你希望每次开新终端都立刻生效的东西。
  • ~/.profile~/.bash_profile 在​​登录 shell​​(login shell)启动时被 source 一次。这里写 export PATH=/opt/conda/bin:$PATHexport TZ=Asia/Shanghaiexport RESEARCH_ROOT=$HOME/research——你希望被这次登录之后的每个程序都看到的环境变量。

zsh(现代 macOS 的默认 shell)对本课所有内容都和 bash 行为一致;这一课里的命令与启动文件规则你都可以原样套用。

练习

Exercise

你刚拿到一个全新的研究机账号。(a) 打印你的家目录和当前工作目录。(b) 创建目录 ~/research/2025-04-24/,在其中 touch 一个文件 notes.md。(c) 用 chmod 显式把 notes.md 设为 0644、目录设为 0755。(d) 运行 ls -lah ~/research/2025-04-24/,确认 notes.md 的模式串是 -rw-r--r--。(e) 在 ~/.profile 中追加 export RESEARCH_ROOT=$HOME/research,开一个新的登录 shell,用 echo $RESEARCH_ROOT 验证新变量已设置。

提示
家目录从环境变量读:echo $HOME;当前目录用 pwdmkdir -p <path> 一次性建好整条路径,不会因为中间层缺失而报错。
提示
八进制 0644 = rw-r--r--0755 = rwxr-xr-x。给文件用 chmod 0644;给目录用 chmod 0755。修改 ~/.profile 后需要新开一个登录 shell(例如重新 ssh 一次),它才会被重新 source。

下一课预告

文件在哪、谁能读写、Shell 怎么找程序——这一层 substrate 就到这里。下一课进入 Unix 哲学的核心:用 | 把小程序串起来。你会看到 grepsedawkjq 怎么把一个 tick 文件压成「行数、品种数、总成交额」三个数;也会学会一条纪律——超过三段、需要跨行状态,就该停下来写 Python 了。

阅读清单

  • 《鸟哥的 Linux 私房菜》第四版,第 5–7 章(文件权限、目录配置、用户与群组)。
  • GNU coreutils 中文手册(社区翻译)。
  • man bash 中文版关于 ~/.bashrc~/.profile 的小节。
  • OpenSSH 中文手册关于 ~/.ssh/ 权限的章节。

补一条额外注释:A-股 量化团队(私募 / 公募 / 券商自营)通常在 Linux 研究机 上完成所有数据落地与回测,Windows 仅用作交易终端。把研究机当成你工作日的家——熟悉到能在黑屏里 cd 不看路径。

参考卡

本课 三 块 Fenced ```bash 与 Inline 行内 代码:ls -lahchmod 三 连、shell 环境 演示;~/.bashrc~/.profile 的 区别;export PATH=/opt/conda/bin:$PATH