linux 初探

前言

记得一开始入门Linux是因为在windows中安装ros太折腾了,虽然最终安装ok了(后来却没有去学习),但过程很不爽,一气之下就转战了ubuntu(2018年夏),真的时间不等人啊,使用这个系统,基本上就是工作在一个黑框下,配置着绿色的字体(嗯,原谅绿), 当然,为了简化日常操作,通过oh-my-zsh配置了自己的zsh(说好的折腾呢?),下面是自己的插件,plugins=(git zsh-autosuggestions wd extract z) ,就说一个extract吧,一个x基本就能解压所有压缩格式了,是不是。。。很方便?感兴趣的自己去搜搜吧,插件不要太多,就像vim一样,插件太多了,会适得其反。 当然值得一提的还是zsh-autosuggestions, 自知记性不太好,有的时候只是知道个模糊的开头,这个工具就可以大大的简化自己的日常操作,很是过瘾啊。 扯个题外话,git是非常值得拥有的工具,可以将自己的本地的文本免费的托管到github,即使换其他的电脑也不耽误事,很是方便。 也许多年之后返回来看一些东西,别有另一番的感觉呢?

另外值得推荐的工具就是you-get 了, 要学习很多视频,很多视频是值得收藏与学习的,用you-get可以从命令行中下载自己想要的视频,是不是很过瘾呢,感兴趣的自己搜一下吧,如果想下载其他的alias这个工具也是不错的。 突然又想到了个事,文件的权限问题,有时不要乱给文件赋予高级权限(比如随手sudo chmod +777 给一个文件,早晚得吃亏),万一那个文件是间谍咋整。。。。。

偶尔会去调试别人发布在github中的python程序(好奇心的驱使),安装需要依赖的包的时候以及管理python环境时anconda是个非常不错的选择。主要是方便管理环境,貌似在Windows里面不只是要把bin文件目录添加到环境变量中,还有其他的东西要添加,比较折腾. 还有比如you-get这类工具是对python的环境是有依赖的,所以了解ananconda还是能节省些时间,总不想在配置环境的时候就耽误很多时间吧。

远程ssh

ssh用起来是非常方便的,下面搬运yangbingdong博客里的内容。安装ssh

sudo apt install ssh
sudo apt install openssh-server

查看启动成功: ps -e|grep ssh, 如果看到sshd那代表成功了, 如果没有, 执行:

sudo/etc/init.d/ssh start

ssh的配置文件位于/etc/ssh/sshd_config, 修改后需要重启ssh:

sudo /etc/init.d/ssh resart

生成SSH密钥和公钥,在这里说明一点为什么要生成密钥和公钥(用自己的看法),如果经常远程操作一台电脑的话,每次都要输入密码,这个就比较费事,如果将这个公钥写入~/.ssh/authorized_keys中,就可以免密码登入了。生成SSH密钥和公钥可用如下指令

ssh-keygen -t rsa -C "your_email@youremail.com"

默认的RSA长度是2048位, 如果非常注重安全, 那么可以指定4096位的长度,剩下的基本一路Enter.

ssh-keygen -b 4096 -t rsa -C "your_email@youremail.com"

说明

1, linux内核是操作系统的核心,分进程管理,储存管理,文件管理,设备管理和网络管理。进程管理:进程控制、进程同步、进程通信、死锁处理、处理机调度等。内存管理:内存分配、地址映射、内存保护与共享、虚拟内存等。 文件管理:文件存储空间的管理、目录管理、文件读写管理和保护等。设备管理:完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。

2, 用 / 代替 cd / ;用 .. 代替 cd .. ;用 …. 代替 cd ../..;用 ~ 代替 cd ~。复制ctrl shift c

3, 远程传输文件可以用scp指令,将文件/文件夹 从远程服务器拷至本地(,这里采用默认的端口,换端口用-P指令就行)

scp -r username@192.168.0.1:/home/username/remotefile.txt
反之 scp -r username@192.168.0.1:/home/username/someFile /home/username/someWhere。

4, 找到重复文件并进行相关处理的工具rdfind,使用命令rdfind ∼/Downloads,结果存储到当前工作目录下一个名为 results.txt的文件中。可以在 results.txt 文件中看到可能是重复文件的名字。删除重复文件,就运行: rdfind -deleteduplicates true ∼/Downloads。

5, tree 工具。它能够以一种美观的方式展示目录、子目录及其中的文件。如果需要了解目录结构,尤其是在删除目录之前,这款工具正好能派上用场(自己的系统中无,需要安装)。

6, 递归下载抓取整个网站内容wget -r -p -k -np 。其中,-p: 下载所有用于显示 HTML 页面的图片之类的元素,-k: 在转换文件 X 前先将它备份为X.orig,-np: 不追溯至父目录。

7, df 和 du 这两个指令可以方便的查看磁盘或者是文件的的空间大小。

8, ‘>’会覆盖原有文件的内容,而’>>’会追加在文件的后面,比如添加一个新的路径,用了’>’然后source ~/.zshrc后,等着哭吧.

9, 使用ctrl-r搜索命令历史记录,反复按ctrl-r循环切换更多匹配,按Enter键执行找到的命令。当然,如果安装了 autosuggestions 这个插件,会自动显示出来,所以说是个非常推荐的zsh插件。

10, 使用ctrl-w删除最后一个单词;使用ctrl-u将当前光标中的内容删除回行的开头;ctrl -a将光标移动到行首;ctrl -e将光标移动到行尾;ctrl -k删除到行尾,ctrl -l 清除屏幕。

11, 返回到上一次的文件夹中可以使用cd -指令, 对于进程的树状形式可以使用指令pstree -p, 查看哪些用户在此电脑上一个w就O了,如果嫌一个指令太长,可以将那个指令通过alias简化,并输入到SHELL配置文件中(.bashrc,.zshrc)。

12, 超快的文件搜索工具Ag,并在vim的配置文件中输入let g:ackprg = ‘ag —vimgrep’, 这样搜索片段的时候会快的很多。

13, touch 创建多个文件比如 touch test_{1..100}.txt, 配合着seq命令使用,有很好的效果,比如 touch $(seq -f ‘vel%g.txt’ 1 10), 或者是中间加一个间隔touch $(seq -f ‘vel%g.txt’ 1 2 10),这个对于自己在做实物测试数据的时候起到了不少的帮助。

14, 常见的Linux顶层虚拟目录名及其内容

展开
\begin{table}
\begin{tabular} {ll}
\hline
目录&     用途 \\ \hline
/ & 虚拟目录的根目录。通常不会在这里存储文件 \\
/bin & 二进制目录,存放许多用户级的GNU工具 \\
/boot & 启动目录,存放启动文件 \\
/dev & 设备目录,Linux在这里创建设备节点 \\
/etc & 系统配置文件目录 \\
/home & 主目录,Linux在这里创建用户目录 \\
/lib & 库目录,存放系统和应用程序的库文件 \\
/media & 媒体目录,可移动媒体设备的常用挂载点 \\
/mnt & 挂载目录,另一个可移动媒体设备的常用挂载点 \\
/opt & 可选目录,常用于存放第三方软件包和数据文件 \\
/proc & 进程目录,存放现有硬件及当前进程的相关信息 \\
/root & root用户的主目录 \\
/sbin & 系统二进制目录,存放许多GNU管理员级工具 \\
/run & 运行目录,存放系统运作时的运行时数据 \\
/srv & 服务目录,存放本地服务的相关文件 \\
/sys & 系统目录,存放系统硬件信息的相关文件 \\
/tmp & 临时目录,可以在该目录中创建和删除临时工作文件 \\
/usr & 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里 \\
/var & 可变目录,用以存放经常变化的文件,比如日志文件 \\ \hline
\end{tabular}
\end{table}

这种分类,给自己编程带来了很多的便利,当然,写一两个函数时候当然无所谓,当函数比较多的时候,就有一点费劲了,将一些函数分类,比如专门存放输出数据的放在一起,方便后续编程来处理这些数据等等.

top 指令根据进程的属主(用户还是系统)和进程的状态(运行、空闲还是等待)将CPU利用率分成几类输出。显示的结果代表的意思:

展开
\begin{itemize}
\item PID:进程的ID。
\item USER:进程属主的名字。
\item PR:进程的优先级。
\item NI:进程的谦让度值。
\item VIRT:进程占用的虚拟内存总量。
\item RES:进程占用的物理内存总量。
\item SHR:进程和其他进程共享的内存总量。
\item S:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表
\item 踪状态或停止状态,Z代表僵化状态)
\item \%CPU:进程使用的CPU时间比例。
\item \%MEM:进程使用的内存占可用内存的比例。
\item TIME+:自进程启动到目前为止的CPU时间总量。
\item COMMAND:进程所对应的命令行名称,也就是启动的程序名。
\end{itemize}

结束进程指令kill,kill 命令可通过进程ID(PID)给进程发信号。默认情况下, kill 命令会向命令行中列出的全部PID发送一个 TERM 信号。

展开
\begin{table}
\begin{tabular}{lll}
\hline
信号 &    名称   &  描述 \\ \hline
1 & HUP & 挂起 \\
2 & INT & 中断 \\
3 & QUIT & 结束运行 \\
9 & KILL & 无条件终止 \\
11 & SEGV & 段错误 \\
15 & TERM & 尽可能终止 \\
17 & STOP & 无条件停止运行,但不终止 \\
18 & TSTP & 停止或暂停,但继续在后台运行 \\
19 & CONT & 在 STOP 或 TSTP 之后恢复执行 \\ \hline
\end{tabular}
\caption{linux进程信号}
\end{table}

当然使用kill的一种好的方法就是配合着 ps 与grep, 通过查找特定进程来将程序关闭。

一般在Linux中绘制流程图会使用plantUML, 当然 ,还是为了提高些效率 ,记不得之前在哪写过关于这方面的东西了, 先不管了, 如果嫌弃自带的分辨率太低的话, 可以使用如下方式更改其分辨率的大小, 比如

scale x*y

入手了MBP后,仍旧想使用自己的老年机(没错,快上大学的时候买的), 于是就想办法怎么去格式化启动盘,下面给出一种方式,在命令行下复制如下代码( 使用diskutil后发现自己的启动盘名称为disk2,其中U盘分了两个区,要不也不会有这段内容了, disk2前面就是格式化完成后的名字了), 话说这个还走了不少弯路。。。。

sudo gpt remove -i 1 disk2

这样的话,就可以把EFI分区给合并了。 然后再对其格式化后,输入如下的指令

sudo dd if=/Users/lsqyRobot/Downloads/archlinux-2020.01.01-x86_64.iso of=/dev/disk2 bs=1m

其中 if 后面跟的是文件的下载路径,后面的就是挂载的u盘了,bs代表着写入的时间。 至于为什么这样做,肯定是有原因的,这个就是为老年机安装了linux mint后,又突发奇想,用了那么久的linux mint 自然想换换口味,就选择arch linux吧,至于分区挂载什么的,之前安装破解一些软件的时候就很熟了,所以想必对自己也不是什么难事。

SHELL 脚本编程

许多程序要求对shell脚本中的命令施加一些逻辑流程控制。有一类命令会根据条件使脚本跳过某些命令。这样的命令通常称为结构化命令(structured command)。

if-then 语句

最基本的结构化命令就是if-then语句。if-then语句有如下格式。

if command 
then
commands
fi

bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码(参见第11章)是0 (该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then 部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。fi语句用来表示if-then 语句到此结束。

鉴于shell脚本不是一两句话就能写完的, 以后专门用一篇或几篇文章记录一下一些shell脚本的编写和使用;

CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp data_struct dots figure gdb latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议