文章目录
- [I/O 重定向元字符](#I/O 重定向元字符)
-
- >(覆盖-标准-输出重定向)
- >>(追加-标准-输出重定向)
- 2>(覆盖-错误-输出重定向)
- 2>>(追加-错误-输出重定向)
- &>(覆盖-合并-输出重定向)
- &>>(追加-合并-输出重定向)
- <(标准输入重定向)
- [<<(Here document 嵌入文档-覆盖)](#<<(Here document 嵌入文档-覆盖))
- [<<<(Here string 嵌入字符串-覆盖)](#<<<(Here string 嵌入字符串-覆盖))
- 管道与进程控制
- 变量
-
- shell变量
- 环境变量
- [](#)
-
- [变量/ {变量} ------ 读取变量](#变量/ {变量} —— 读取变量)
- [1 2 3 ------ 脚本参数](#1 2 3 —— 脚本参数)
- [0 ------ 当前脚本名](#0 —— 当前脚本名)
- [$#------ 参数个数](#—— 参数个数)
- [@ ------ 所有参数](#@ —— 所有参数)
- [$$ ------ 当前进程ID](#$$ —— 当前进程ID)
- [() ------ 命令替换](#() —— 命令替换)
- [(( )) ------ 算术运算](#(( )) —— 算术运算)
- [{ }命令分组](#{ }命令分组)
-
- [{}---变量替换](#{}---变量替换)
- [( )子shell分组](#( )子shell分组)
-
- [()---命令替换](#()---命令替换)
I/O 重定向元字符
>(覆盖-标准-输出重定向)
bash
ll > test.txt
可以在当前目录下的test.txt当中看到
txt
总用量 0
drwxrwxr-x 1 tianbot tianbot 16 1月 5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 142 1月 5 14:07 ../
-rw-rw-r-- 1 tianbot tianbot 0 1月 5 16:22 test.txt
由此可知实际的执行过程是先创建test.txt,再将ll的命令输出到test.txt
>>(追加-标准-输出重定向)
bash
ll >> test.txt
bash
总用量 0
drwxrwxr-x 1 tianbot tianbot 16 1月 5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 500 3月 10 14:20 ../
-rw-rw-r-- 1 tianbot tianbot 0 3月 17 17:25 test.txt
总用量 4
drwxrwxr-x 1 tianbot tianbot 16 1月 5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 500 3月 10 14:20 ../
-rw-rw-r-- 1 tianbot tianbot 172 3月 17 17:25 test.txt
可以看到在原来的基础上增加了输出
2>(覆盖-错误-输出重定向)
常用于将错误输出到日志当中
例如我在终端当中故意打错一个命令
bash
aa 2> error.log
运行之后 终端没有显示错误 但是打开error.log之后 会显示报错信息
bash
bash: aa:未找到命令
2>>(追加-错误-输出重定向)
追加形式(不覆盖)
bash
b 2>> error.log
运行之后error.log文件内
bash
bash: a:未找到命令
bash: b:未找到命令
&>(覆盖-合并-输出重定向)
| 类型 | 编号 | 说明 |
|---|---|---|
| 标准输出 | 1 | 正常输出 |
| 标准错误 | 2 | 错误信息 |
&的意思就是将二者内容合并重定向输出
&>>(追加-合并-输出重定向)
同上,只是换为追加
<(标准输入重定向)
bash
cat < test.txt
等同于cat test.txt
<<(Here document 嵌入文档-覆盖)
使用方式
bash
命令 << 结束符
多行输入文本
结束符
bash
cat > test.txt << oo
jvoabovoabvub
vaknvojbaeojv
vajbivbiabiehvb
vajobvibeiva~
oo
当中oo就是结束符,这个符号可以自己定义,在最后输入oo摁下回车之后上面的文本就被保存在了test.txt当中
<<<(Here string 嵌入字符串-覆盖)
使用方式
bash
命令 <<< 字符串(引号可加可去)
举例
bash
cat > test.txt <<< jcbaocb
管道与进程控制
|(管道)
第一个命令的输出作为下一个命令的输入,对于管道的使用较为频繁
查看文件内容并搜索特定行
bash
cat test.txt | grep "hello"
可以理解为以下的形式
cat test.txt
|
grep "hello"
将cat test.txt的文本cat出来 然后使用grep搜索当中的hello字符串
查看进程并计数
bash
ps ax | grep python | wc -l
ps:表示用户进程,即process status
a:显示所有用户的进程
x:显示没有控制终端的进程(如守护进程)
单独使用ps ax会出现
bash
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /sbin/init text
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [pool_workqueue_release]
4 ? I< 0:00 [kworker/R-rcu_gp]
5 ? I< 0:00 [kworker/R-sync_wq]
6 ? I< 0:00 [kworker/R-slub_flushwq]
7 ? I< 0:00 [kworker/R-netns]
......
接下来将这些输出结果搜索与python相关的进程,即grep python
会输出
bash
726 ? Ss 0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
288053 pts/7 S+ 0:00 grep --color=auto python
之后使用wc进行统计-l表示统计行数,可以得到最后的输出为
bash
2
所以整体的命令就是所有进程当中与python相关的进程有几项
列出文件并按大小排序
bash
ls -la | sort -nk5
查看环境变量
这条命令我个人比较喜欢,可以将环境变量当中的:换成换行,更加清晰
bash
echo ${PYTHONPATH} | tr ':' '\n'
输出显示
bash
/home/tianbot/study_ws/devel/lib/python3/dist-packages
/home/tianbot/.ros1/lib/python/site-packages
/home/tianbot/manipulation_ws/devel/lib/python3/dist-packages
/home/tianbot/tianbot_mini_ws/devel/lib/python3/dist-packages
/opt/ros/noetic/lib/python3/dist-packages
/usr/lib/python3/dist-packages
&(后台运行)
bash
sleep 3 &
回车后会显示
bash
[1] 268174
后面的数字代表PID
之后按回车键会显示
bash
[1]+ 已完成 sleep 3
jobs
对于长久在后台执行的任务,使用jobs可以显示所有在后台执行的任务
bash
tianbot@tianbot:~$ sleep 20 &
[1] 1377273
tianbot@tianbot:~$ sleep 20 &
[2] 1378039
tianbot@tianbot:~$ jobs
[1]- 运行中 sleep 20 &
[2]+ 运行中 sleep 20 &
kill %1
对于jobs显示的进程,可以使用kill+%+进程号的形式进行杀死
bash
tianbot@tianbot:~$ sleep 20 &
[1] 1392733
tianbot@tianbot:~$ jobs
[1]+ 运行中 sleep 20 &
tianbot@tianbot:~$ kill %1
tianbot@tianbot:~$ jobs
[1]+ 已终止 sleep 20
;(命令分割-顺序执行)
没有逻辑判断,直接顺序执行
bash
ll ; ll
会输出
bash
总用量 4
drwxrwxr-x 1 tianbot tianbot 16 1月 5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 142 1月 5 14:07 ../
-rw-rw-r-- 1 tianbot tianbot 10 1月 5 16:56 test.txt
总用量 4
drwxrwxr-x 1 tianbot tianbot 16 1月 5 16:22 ./
drwxrwxr-x 1 tianbot tianbot 142 1月 5 14:07 ../
-rw-rw-r-- 1 tianbot tianbot 10 1月 5 16:56 test.txt
||(逻辑或)
可以理解为:如果报错了就执行下一个命令
bash
mkdir test || echo "创建失败"
&&(逻辑与)
可以理解为:执行完之后成功了再执行下一个(如果第一个命令失败了就没有之后了)
bash
mkdir test && cd test
创建目录成功 → 再进入目录
变量
shell变量
直接在shell里面写,此时这个变量的作用范围就是当前shell脚本
bash
name="Tom"
当然,如果使用unset可以提前终止其作用范围
bash
unset name
环境变量
添加export
bash
export ROS_MASTER_URI=http://localhost:11311
此时ROS_MASTER_URI就被添加到环境变量env当中了
可以使用env查看
bash
env
也可以使用set查看,一般不用,因为其会显示
1、shell变量
2、环境变量
3、函数
bash
set
$
变量/ {变量} ------ 读取变量
注意:这个变量可以是shell变量也可以是环境变量
bash
echo ${BASH}
1 2 $3 ------ 脚本参数
比如创建一个脚本
bash
#!/bin/bash
echo $1
echo $2
运行
bash
./test.sh hello world
输出
bash
hello
world
$0 ------ 当前脚本名
相当于第0个参数
$#------ 参数个数
$@ ------ 所有参数
$$ ------ 当前进程ID
$() ------ 命令替换
比如
bash
dir=$(pwd)
echo $dir
#输出/home/user
$(( )) ------ 算术运算
bash
a=10
b=20
c=$((a+b))
echo $c
# 输出30
{ }命令分组
{ } 没有创建新的 shell,变量修改会影响外部。
${}---变量替换
bash
echo ${PATH}
( )子shell分组
子shell修改变量
父shell不受影响
$()---命令替换
激活mamba环境时
bash
eval "$(micromamba shell hook --shell bash)"
eval "字符串"==把字符串当作命令执行
eval "pwd"==pwd