对于Scientific Linux以及CentOS非必要不要升级任何文件

  • 特别是“应用程序”中的“软件”与“软件更新”;
  • 最好不用“yum -y update”(明白的人除外);
  • 系统提示的更新一定要忍住,不要更新;

不要更新!不要更新!不要更新!

常用命令

cd

  • cd
  • cd ..
  • cd 目录

ls

  • ls -a
  • ls -lhrt

cp

  • cp -r /A/file1 /B/file2
  • 拷贝A处file1,并在B处生成file2
  • scp -r usrname1@IP1:/path1/dir1/file1 usrname2@IP2:/path2/dir2/file2

mv

  • mv /A/file1 /B/file2
  • 将A处的file1移动到B处并该名为file2

rm

  • rm -rf file1
  • 删除file1
    • -r:包括子目录
    • -f:强制

mkdir

  • mkdir /A/dir
  • 创建文件夹

touch

  • touch /A/file1
  • 创建文件

find

  • find ./ -name "." | xargs grep "Hello"

grep

  • 搜索关键字
    • grep -r "目标字符"

tar

  • 将'tele2_tracking'压缩,其压缩后文件名为'tele2_tracking.tar.gz'
    • tar -czvf tele2_tracking.tar.gz tele2_tracking
  • 解压'tele2_tracking.tar.gz'
    • tar -zvxf tele2_tracking.tar.gz

软链接

  • 创建:ln -s source_dir alias_name
  • 删除:unlink alias_name

批量重命名

  • 方法一:mv配合for循环方式进行修改
    • for name in `ls *.html`;do echo $name ${name%.html}.jpg;done
    • for name in `ls *.html`;do mv $name ${name%.html}.jpg;done
  • 方法二:sed命令
    • ls jpg|sed -r 's#(.).jpg#mv & \1.mp4#'|bash
  • 方法三:rename命令(格式:rename 原名 替换名 要改的文件)
    • rename txt jpg *

gcc and g++

参考网址:爱编程的大丙

gcc、g++区别

  • 编译阶段
    • .c文件:gcc当作C语言,g++当作C++语言
    • .cpp文件:都会当作c++程序
    • g++会调用gcc
  • 链接阶段
    • 二者都自动链接到标准C库
    • g++可以自动链接到标准C++库,而gcc要链接到标准C++库需要加参数 -lstdc++
  • 关于_cplusplus宏的定义
    • g++会自动定义_cplusplus宏,但不影响编译C程序
    • gcc需要根据文件后缀判断是否需要定义_cplusplus宏
  • gcc>4.8.5,支持C++11

gcc与g++功能相同,仅仅针对不同的语言,以下说明以gcc为例

源代码到可执行文件的基本流程

源文件->预处理->编译(预编译-语法检查、编译-优化生成中间文件)->链接->可执行文件

  • 预处理:

    • 头文件展开,宏替换,去掉注释行
    gcc -E *.c > *.txt
    
  • 编译:

    • 生成目标文件
    gcc -c *.c (默认生成*.o文件-二进制文件)
    
  • 链接:

    • 多个目标文件(动态库,静态库)链接到一起生成最终的可执行文件
    # “-o”:指定输出目标文件名
    gcc *.o -o *.exe
    

gcc功能项

  • -E:预处理后的C文件-》得到.i文件
  • -S:编译后得到的汇编语言的源文件-》得到.s文件
  • -c:汇编后得到二进制文件-》得到.o文件

  • -o:指定输出文件名字

  • -I:指定include包含文件的搜索目录

    • 当.c文件调用的.h文件不在当前目录下,编译提示找不到.h文件
    • 用此命令指定调用目录
      gcc *.c -Iinclude -o *.exe
      gcc *.c -I include -o *.exe
      
  • -l: 编译时指定使用的库,使用时去掉lib文件名的lib头以及后缀
  • -g: 编译时生成调试信息,可以被调试器调试
  • -D:编译时指定一个宏(gcc定义的宏)
    • 当.c文件中的宏(define)没有被定义时;
    • 编译时指定一个程序调用的宏
      gcc *.c -D DEBUG -o *.exe
      
    • 通常用作控制log日志的输出与否
      • 即.c代码调用宏(#ifdef DEBUG)但不会定义宏(#define DEBUG),编译时调用部分会当作注释
      • 而gcc调试时,利用-D定义宏,则会执行相关代码,方便输入log日志,调试代码
  • -Wall:生成所有警告,警告有时候就是错误
  • -On: 优化,n(0~3)优化级别,
  • -std:指定C方言,如:-std=c99

静态库和动态库

  • 作用

    • 减少源文件
    • 源代码保护
  • 注意

    • 要提供API函数的声明,即头文件
  • 静态库

    • Linux:libxxx.a; Windows:libxxx.lib
    • 无执行权限
    • 静态库生成:源文件汇编成.o文件,打包.o文件(ar工具)
      gcc -c *.c
      # 若无头文件需要用-I指定头文件路径
      # -c自动生成*.o文件,无需-o指定
      ar rcs libxxx.a *.o
      # -c:无论库存在与否都将创建
      # -s:创建目标文件索引,加快创建库的时间
      # -r:在库中插入模块(替换)
      
    • 发布静态库
      • .h的头文件
      • libxxx.a文件
    • 静态库的使用
      • 与调用头文件以及调用函数体类似
        gcc *.c -o *.exe -L ./path -l cali
        
  • 动态库

    • Linux:libxxx.so; Windows:libxxx.dll
    • 有执行权限
    • 动态库的生成
      gcc *.c -c -fpic
      # -fpic:gcc生成的代码与位置无关,相对位置
      gcc -shared *.o -o libxxx.so
      # -shared: 告诉编译器生成一个动态链接库
      
    • 动态库的使用
      gcc *.c -L ./path -l库名 -o cali
      
    • 动态库生成的执行文件在更换位置后再执行提示找不到库
      • 动态链接器没有找到相关库
        • 可执行文件内部的DT_RPATH段
        • 系统环境变量LD_LIBRARY_PATH->可操作
        • 系统动态库的缓存文件/etc/ld.so.cache(修改ld.so.conf文件)->可操作
        • 存储动态库、静态库的系统目录/lib/、/usr/lib等->可操作
      • 检测动态库依赖:ldd 可执行文件

安装软件(库)

CentOS\SL

yum方式

  • 安装:yum -y install software(lib)_name
    • -y:对于询问内容自动yes;
  • 查询:provides software(lib)_name

rpm安装

  • 安装:rpm -ivh software.name
  • 更新:rpm -Uvh software.name
    • -i:表示安装
    • -v:表示显示安装过程
    • -h:表示显示进度
    • -U:表示更新
    • ps:安装软件会提示缺少库,可用yum中的查询方法找到对应的文件,再利用yum安装库文件;然后再安装(更新)软件;
  • 查询:rpm -qa | grep [google]
  • 卸载:rpm -e --nodeps [google-chrome-stable]

Ubuntu

apt-get/apt

  • 安装:apt-get -y install software(lib)_name
    • -y:对于询问内容自动yes;
  • 更新源:apt-get update
    • 源库文件:/etc/apt/source.list
  • 更新:apt-get upgrade
  • 删除无用库:apt-get -y autoremove

dpkg安装

  • -i: 安装
  • -L: 显示关联
  • -I: 显示包的版本
  • -r: 删除(保留配置)
  • -P: 删除(不保留配置)
  • -s: 查找包的详细信息
  • -c: 列出deb包的内容
  • -S: 搜索所属包的内容
  • -unpack: 解开deb包的内容
  • -configure: 配置包

权限更改

更改文件所有人

  • 文件本身:chown username file/dir
  • 文件及内容:chown -R username file/dir

更改文件所有组

  • 文件本身:chgrp groupname file/dir
  • 文件及内容:chgrp -R groupname file/dir

更改文件权限

  • chmod [-R] <u|g|o><+|-|=><r|w|x> file|dir
  • file1拥有者去掉x权限:chmod u-x file1
  • file1拥有组添加w权限:chmod g+w file1
  • file1拥有者去掉x权,file1拥有组添加w权限:chmod u-x,g+w file1
  • file2的用户组其他人去掉r权限:chmod ugo-r file2
  • file3用户和组添加x权限,其他人去掉r权限:chmod ug+x,o-r file3

光盘挂载

  • 查看挂载、分区目录
    • df -lh
    • fdisk -l
  • 手动挂载
    • mount -a
    • mount 设备文件名 挂载点目录
  • 卸载
    • umount 分区目录
  • 自动挂载
    • 编辑:vim /etc/fstab
    • 写入:
盘符位置(分区) 挂载目录 文件系统 defaults 0 0
UUID,路径 路径 ext4, FAT32, nfts 开机不检
  • 保存

查看磁盘UUID

  • 先用mount挂载到某一文件夹下;
  • 用命令ls -l /dev/disk/by-uuid

history(历史命令)

  • ctrl+r:连续关键字搜索;
  • ![num]:history中第[num]个命令;
  • ![字符串]:匹配输入过的最近的命令;
  • 上下按键;

文件查看

  • cat /path/file:一次显示所有;
  • more /path/file:分页显示所有,回车刷一行,空格刷一页;
  • less /path/file:分页显示所有,回车刷一行,空格刷一页,pageup向前;
  • head /path/file:显示文件开头内容;
    • -n [行数] :前[行数]行;
  • tail /path/file:显示文件尾部内容;
    • -n [行数]:后[行数]行;
    • -f:动态显示数据(不关闭),常用于查看日志;

进程管理

  • 查看端口占用
    • lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000
      • netstat -tunlp |grep 端口号,用于查看指定的端口号的进程情况,如查看8000端口的情况,netstat -tunlp |grep 8000
  • 查看进程
    • ps -ef
    • ps -aux
  • 杀掉进程

Vim编辑器

进入编辑模式

  • i:光标前插入;
  • I:行首插入;
  • a:光标后插入;
  • A:行尾插入;
  • o:下一行插入;
  • O:上一行插入;
  • x:向后删一个字符;
  • X:向前删一个字符;
  • u:撤销一步;
  • r:替换光标所在;

编辑模式

  • ny, yy, nyy:字符、单行、多行复制;
  • x, dd, ndd:字符、单行、多行删除;
    • dd:也是剪切;
  • p:粘贴;
  • D:从光标到行尾删除;
  • ctrl+r:回复撤销;
  • ctrl+v:可视化模块;
  • ctrl+V:可视化行模块;

    • 多行插入:
      • ctrl+v选择块;
      • I:输入“#”或“//”;
      • Esc:退出;
  • ctrl+s:阻止之后的输入

  • ctrl+o:解除ctrl+s

命令行模式(“:”进入)

  • :w:保存;
  • :w!:强制保存;
  • :q:不存退出;
  • :q!:强制不存退出;
  • : wq!:强制保存退出;
  • 替换
    • %s/旧内容/新内容/gi
    • 1,3s/旧内容/新内容/gi
      • %:全部;
      • 1,3 :1~3行;
      • g:全部;
      • i:不区分大小写;
  • 查找
    • /内容
    • n:找下一个;
    • N:找上一个;

定制环境

  • 临时设置
    • :set nu:行号;
    • :set nonu:不显示行号;
    • :set list:显示控制符;
    • :set ai:自动缩进;
  • 永久设置
    • vim ~/.vimrc
    • 写入上述内容并保存;

同时处理两个文件

  • vim file1 file2
  • vim -o file1 file2:同窗上下分屏显示;
  • vim -O file1 file2:同窗左右分屏显示;
    • ctrl+w:两文件切换;
    • :qa:关闭退出俩文件;
  • diff file1 file2:对比两文件不同,仅输出不同部分;
  • vimdiff file1 file2:同窗左右分屏打开两文件,并比较不同部分;

vim插件管理

依靠git,网络不稳定;

手动设置软件自启动(针对远程桌面工具)

  • Scientific Linux 7.4
    • 应用程序-》工具-》优化工具-》开机启动程序
  • CentOS 7
    • 应用程序-》附件-》优化-》开机启动程序

Linux修改SSH登录欢迎语

  • 只需修改配置文件:/etc/motd (root权限下)
  • 无此文件创建一个即可;

Ubuntu安装低版本gcc和g++

本说明以ubuntu20.04为例

安装与配置

  • 使用命令安装gcc和g++

    • sudo apt-get install gcc-4.9
    • sudo apt-get install g++-4.9
  • 查看已经安装的gcc和g++版本

    • ls /usr/bin/gcc*
    • ls /usr/bin/g++*
  • 查看当前应用的gcc版本

    • gcc -v
    • g++ -v
  • 需要设置优先级(由于ubuntu20.04中已经存在gcc9.3,以便选取对应版本的gcc)

    • sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 40
    • sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
    • sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 40
    • sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90
  • 选择gcc/g++版本

    • sudo update-alternatives --config gcc
    • sudo update-alternatives --config g++

    根据提示选择对应的gcc/g++版本

如果提示找不到新源

编写makefile

参考网址:C语言_编程俱乐部哩哔哩哔哩呀

  • main.c, .h, .c
  • 编写makefile文件

版本1

#语法说明
#目标文件名:源文件名  #该行命令编译时会自动比较目标文件与所有源文件的时间戳!!!进而自动选择是否再次编译
#    gcc 源文件名 -o 目标文件名

suanshu.exe:main.o jia.o jian.o
    gcc main.o jia.o jian.o -o shuanshu.exe
main.o:main.c
    gcc -c main.c -o main.o
jia.o:jia.c
    gcc -c jia.c -o jia.o
jian.o:jian.c
    gcc -c jian.c -o jian.o

clean:
    rm -rf *.o suanshu.exe

版本2

#"*":通配符,任意个任意字符
#"$@":代表目标文件
#第一行中main.o要放到最前面
#"$<":一个一个匹配依赖
#"%":同一句中,%代码相同的名字
math.exe:main.o jia.o jian.o
    gcc *.o -o $@
%.o:%.c
    gcc -c $< -o $@

clean:
    rm -rf *.o math.exe

版本3

#"$^":表示上一句中冒号后面所有依赖的文件(源文件)
OBJS=main.o jia.o jian.o
CC=gcc
#CFLAGS:编译选项
CFLAGS+=-c -Wall -g

math.exe:$(OBJS)
    $(CC) $^ -o $@
%.o:%.c
    $(CC) $^ $(CFLAGS) -o $@

clean:
    rm -rf *.o math.exe

删除或添加系统引导项

  • 修改配置文件:/etc/grub2.cfg;

VS code 安装与配置

VS code 安装(参照官网

  • sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
  • sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'

Methed 1-new

  • dnf check-update
  • sudo dnf install code

Methed 2-old

  • yum check-update
  • sudo yum install code

VS code 配置ROOT与Geant4库函数

  • 参考网站:

  • 方法简介:

    • 用vs code打开代码文件夹;
    • 在扩展选项中安装“C/C++”,“C++ intellisense”,“CMake Tools”;
    • 打开vs code控制台(ctrl+shift+p),找到“C/C++ :Edit Configurations(JSON)”点击,这时候会自动生成了一个隐形文件“c_cpp_properties.json”;
    • 对应添加如下信息
    "configurations": [
          {
              "name": "Linux",
              "browse": 
              {
                  "path": [
                        "${workspaceFolder}/sim/src",
                        "${workspaceFolder}/sim/include",
                        "${workspaceFolder}/yblib/src",
                        "${workspaceFolder}/yblib/include",
                        "/opt/root61600/include",
                        "/opt/Geant4/geant41004/include/Geant4"
                  ],
                  "limitSymbolsToIncludedHeaders": true
              },
              "includePath": [
                  "${workspaceFolder}/sim/src",
                  "${workspaceFolder}/sim/include",
                  "${workspaceFolder}/yblib/src",
                  "${workspaceFolder}/yblib/include",
                  "/opt/root61600/include",
                  "/opt/Geant4/geant41004/include/Geant4"
              ],
              "defines": [],
              "compilerPath": "/usr/bin/gcc",
              "cStandard": "c89",
              "cppStandard": "gnu++98",
              "intelliSenseMode": "linux-gcc-x64"
          }
      ],
      "version": 4
    }
    

Shell脚本

example1-检查复制进度

#!/bin/bash
 path="/mnt/backup/c2rootfile/"
 while [ 0 -le 1 ]
 do 
 message1=$(/usr/bin/ls -lhrt $path | tail -n 1)
 echo $message1
 sleep 10 
 message2=$(/usr/bin/ls -lhrt $path | tail -n 1)
 echo $message2
 sleep 10
 echo $(/usr/bin/ls -hrt $path | wc -l)
 echo "尚须拷贝文件数量:$[1087-$(/usr/bin/ls -hrt $path | wc -l)]"
 if [ "$message1" = "$message2" ]
 then
 exit 1
 fi
 sleep 10
 done

example2-find变形

#!/bin/bash
path=$1
name=$2
find $path -name "*.*" | xargs grep $name

example3-if中多个条件的逻辑

#!/usr/bin/bash

#for i in $(seq ${1} ${2})
for i in $(seq 207 458)
do
  {
    #if [ ${i} -gt 261 -a ${i} -lt 275 -o ${i} -gt 306 -a ${i} -lt 330 ]
    #if [ ${i} -gt 261 -a ${i} -lt 275 -o ${i} -gt 306 -a ${i} -lt 330 -o ${i} -gt 362 -a ${i} -lt 365 -o ${i} -gt 367 -a ${i} -lt 371 -o ${i} -eq 389 ]
    if [ ${i} -ge 262 -a ${i} -le 274 -o ${i} -ge 307 -a ${i} -le 329 -o ${i} -ge 363 -a ${i} -le 364 -o ${i} -ge 368 -a ${i} -le 370 -o ${i} -eq 389 ]
    then
      echo "In:the number ${i}!"
    else
      echo "Out:the number ${i}!"
    fi
  }
done

注意:在[ ]中不能用“&&“和” ||”!

example4-并行脚本

#!/usr/bin/env bash

# 获取脚本开始时间
start_ns=$(date +%s%N)
start_us=${start_ns:0:16}
# 王东玺所用数据:207--458
# 束流刻度数据:  1030-1048
# 源刻度数据:    1065-1129
# 调束等无效数据:262-274,307-329,363,364,368-370,389
runlist=(207 220 225 248 300 350 400 450 458)

# ============= 脚本主体 =========================
trap "exec 1000>&-;exec 1000<&-;exit 0" 2
thread=20
tmpfifo=$$.fifo
mkfifo $tmpfifo
exec 1000<>$tmpfifo
rm -rf $tmpfifo

for ((i=1;i<=$thread;i++))
do
  echo >&1000
done                

# 从任务队列中依次读取任务
for i in $(seq 207 458)
#for i in $(seq ${1} ${2})
#for i in ${runlist[@]}
do
  read -u1000
  {
    if [ ${i} -le 206 -o ${i} -ge 262 -a ${i} -le 274 -o ${i} -ge 307 -a ${i} -le 329 -o ${i} -ge 363 -a ${i} -le 364 -o ${i} -ge 368 -a ${i} -le 370 -o ${i} -eq 389 -o ${i} -ge 459 -a ${i} -le 1029 -o ${i} -ge 1049 -a ${i} -le 1064 -o ${i} -eq 1074 -o ${i} -eq 1077 -o ${i} -eq 1082 -o ${i} -eq 1093 -o ${i} -eq 1094 -o ${i} -eq 1103 -o ${i} -eq 1104 -o ${i} -eq 1107 -o ${i} -eq 1112 -o ${i} -eq 1115 -o ${i} -eq 1123 -o ${i} -ge 1130 ]
    then
      echo "the run of ${i} is bad!"
      echo >&1000
    else
      echo ${i}
     ./tele ${i} &> ./log/${i}
     echo >&1000
    fi
  } &
done
wait
exec 1000>&-
# ================================================


# 获取脚本结束时间,计算脚本运行时间
end_ns=$(date +%s%N)
end_us=${end_ns:0:16}
echo "==============================="
echo -n "cost time(s): "
echo "scale=3;($end_us-$start_us)/1000000" | bc

exit 0

北大网关断网后terminal登陆方法

本说明在北京大学网关掉线,而恰巧本人无法接触到自己主机无法手动登陆北大账户

  • 从北大官网下载北大网关客户端Linux版
  • 下载对应版本的客户端后,解压缩
    • tar .tar //for.tar文件
    • tar -zxvf .tar.gz //for .tar.gz
  • ./connect -u [usernumber] -p [password]
In [2]:
!jupyter nbconvert Linuxtips_xi.ipynb --to html
[NbConvertApp] Converting notebook Linuxtips_xi.ipynb to html

[NbConvertApp] Writing 328526 bytes to Linuxtips_xi.html

In [ ]: