Linux

从零开始搭建开发环境

创建带有sudo权限的用户

useradd <user_name> -m -G sudo

Note

-m 表示同时创建用户目录

-G 指明该用户所在的用户组,而 sudo 是系统默认拥有sudo权限的用户组

更多命令参数可以通过 useradd -h 来查看

也可以给一个已存在用户赋予sudo权限:

usermod <user_name> -a -G sudo

安装oh-my-zsh

zsh是一个非常好用的交互式终端,因为其具备众多好用的插件而被广泛使用。

oh-my-zsh则承担了zsh各类插件的管理工作。

首先需要在Linux系统上安装zsh

sudo apt update
sudo apt install zsh

修改登录时启用的终端类型

usermod <user_name> -s /bin/zsh

从github下载安装 oh-my-zsh,详见 README.md

更改linux网络设置

apt源

apt源的配置文件位于 /etc/apt/sources.list

以更换为阿里云的apt源为例,可以用以下命令来修改:

sed -i 's|archive.ubuntu.com|mirrors.aliyun.com|g' /etc/apt/sources.list
sed -i 's|security.ubuntu.com|mirrors.aliyun.com|g' /etc/apt/sources.list

上面的 sed 命令可以完成文件中所有匹配字符串的替换。

pip源

用户的pip源配置文件位于 ~/.pip/pip.conf,如果没有可以新建一个。

以更换为阿里云的pip源为例,pip.conf 内容如下:

[global]
index-url= http://mirrors.aliyun.com/pypi/simple/
extra-index-url= https://pypi.python.org/simple
trusted-host=mirrors.aliyun.com

系统默认的pip源配置文件位于 /etc/pip.conf,修改方法同上,该文件可以影响到所有用户。

设置代理

通常用 export 指令来实现,如果需要长期保存可以加到 .bashrc 中去。

export http_proxy="http://localhost:port"
export https_proxy="http://localhost:port"

DNS

DNS配置文件位于 /etc/resolv.conf 文件中,更改 nameserver 即可。

Warning

这样只能临时修改DNS,重启后失效。

Warning

方法来自百度,没有验证过。

环境变量之系统路径

  • PATH

可执行文件的路径。

  • LIBRARY_PATH

程序编译期间查找动态链接库时指定的其他共享库的路径。

  • LD_LIBRARY_PATH

程序加载运行期间查找动态链接库时指定其他路径。

  • C_INCLUDE_PATH

C程序编译期间查找头文件时指定的其他路径。

  • CPLUS_INCLUDE_PATH

C++程序编译期间查找头文件时指定的其他路径。

  • CPATH

C和C++程序在编译期间查找头文件时指定的其他路径。

配置cuda

通常来说,使用第三方硬件需要安装SDK后配置以上几个环境变量,令其可以在编译时成功 include,在运行时找到库文件。

以cuda为例编写自动化配置脚本:

#!/bin/bash -e

function on_error() {
    echo  $1
    exit -1
}

for i in $(readlink -f $(dirname $0))/*; do
    [ -d $i ] || continue
    i=$(readlink -f $i)
    if [[ $(basename $i) =~ cuda-[10.]*$ ]]; then
        if [ -z "$cuda" ]; then
            cuda=$i
        else
            on_error "multiple cuda found"
        fi
    fi
    [ -d $i/include ] || on_error "$i/include not existing"
    INCL=$INCL:$i/include
    lib=$i/lib
    [ -d $lib ] || lib=$i/lib64
    [ -d $lib ] || on_error "$lib not existing"
    LIB=$LIB:$lib
done

LIB=${LIB#:}
INCL=${INCL#:}

[ -z "$cuda" ] && on_error "cuda not found"

NEW_CPATH=$CPATH:$INCL
NEW_CPATH=${NEW_CPATH#:}
NEW_LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB
NEW_LD_LIBRARY_PATH=${NEW_LD_LIBRARY_PATH#:}
NEW_LIBRARY_PATH=$LIBRARY_PATH:$LIB
NEW_LIBRARY_PATH=${NEW_LIBRARY_PATH#:}

echo "CPATH=$NEW_CPATH"
echo "LD_LIBRARY_PATH=$NEW_LD_LIBRARY_PATH"
echo "LIBRARY_PATH=$NEW_LIBRARY_PATH"
echo "PATH=$PATH:$cuda/bin:$cuda/NsightCompute-2019.1"
echo "CUDA_HOME=$cuda"

编写shell脚本

有关于shell脚本的内容,可以参考 菜鸟教程

特殊符号

符号

描述

$

变量替换

${}

变量替换

${:}, ${::}

提取字符串

${/}, ${//}

字符串模式匹配(替换)

${#}, ${##}

字符串模式匹配向左截断

${%}, ${%%}

字符串模式匹配向右截断

``

命令替换

$()

命令替换

var = "/dir1/dir2/my.file.txt"
$var             # /dir1/dir2/my.file.txt
${var}           # 同上
${var:1:3}       # di
${var:1}         # dir/dir/my.file.txt
${var:-2}        # xt
${var/dir/path}  # /path1/dir2/my.file.txt, 替换第一个
${var//dir/path} # /path1/path2/my.file.txt,替换全部
${var#*/}        # dir0/dir2/dir3/my.file.txt, 删掉左数第一个'/'及其左边的字符串
${var##*/}       # my.file.txt, 删掉左数最后一个'/'及其左边的字符串
${var%/*}        # /dir1/dir2/dir3, 删掉右数第一个'/'及其右边的字符串
${var%%/*}       # (空值),拿掉右数最后一个'/'及其右边的字符串
HOME = $(cd `dirname $0`; pwd) # 本执行文件所在的目录路径保存为HOME

更多内容查看非官方的 shell特殊字符大全

判断表达式

文件比较

符号

含义

-e

文件是否参在

-d

是否为目录

-f

是否为常规文件

-r

是否可读

-w

是否可写

-x

是否可执行

-L

是否为符号链接

字符串比较

符号

含义

-z

长度为零为真

-n

长度非零为真

s1 = s2

相同为真

s1! = s2

不同为真

算数比较

符号

含义

-eq

相等为真

-ne

不等为真

-lt

小于为真

-le

小于等于为真

-gt

大于为真

-ge

大于等于为真

vscode

修改vscode配置

setting 界面修改

打开 setting 按钮即可。

通过配置文件 setting.json 修改

在两个地方存在 setting.json 文件。一是本地vscode的安装目录下,作用于所有项目或窗口;另一个是项目根目录下的 .vscode/setting.json,作用于当前项目。

json 文件以字典的形式存在,比如 修改vscode字体

一些好用的vscode插件

  • Remote-SSH 远程开发

  • Vim 使用vim类型快捷键

  • GitLens 每行代码的上一次提交记录

  • Bracket Pair Colorizer 括号匹配

  • Material Icon Theme 文件图标

  • CMake 文本高亮

  • reStructuredText rst文件预览

  • Markdown Preview Enhanced md文件预览

  • Clang-Format 格式化c++文件

远程开发环境

这个不必多说了,非常好用,只需要在本地vscode安装 Remote-SSH 插件,就可以连接远程Linux服务器,体验与本地开发相同。

如果服务器访问外网有限制,可能会出现一些奇怪的bug,此时需要配置好代理。

设置等宽字体

通常来说,大部分字体都是中文和英文分别等宽,但是中英文混合就不等宽了。 中英文不等宽会导致制作 rst 表格时感觉非常别扭,因为边界不是正经的直线。

更纱黑体

这是一个字体集合,英文名为Sarasa Gothic,其中的 Sarasa Mono SC 可以支持中英文混合等宽。

项目地址为 Sarasa-Gothic,直接从Releases界面下载名字含有ttf的压缩包,解压后双击其中的 sarasa-mono-sc-regular.ttf 文件安装。

安装成功后,操作系统就可以为各类软件提供该字体。

Warning

安装完毕需要重启才能生效

在vscode中设置字体

在vscode的 setting.json 文件中增加一行:

"editor.fontFamily": "Sarasa Mono SC"

git

git进阶用法

拆分提交历史的某个commit

假设需要把提交版本A拆分为两个commit。

  1. git rebase -i <SHA> 进入交互模式:这里的 <SHA> 必须要早于A。

  2. 把要A对应的命令改为 edit

  3. 撤销到A的上一次提交。

  4. 分别提交两次,取决要要怎么改。

  5. git rebase --continue