Ubuntu sh文件编写,开多终端,自动读取密码
在最近的项目调试中经常需要开多个终端启动多个launch,这样的操作多了难免会感到烦躁并且时间一长再回去使用一些功能包的时候就会忘记需要启动哪些文件,因此我特意学了一手如果编写sh开启多个终端以及在sh文件中使用sudo命令自动读取密码
开启多个终端
以古月的mbot为例,我们要实现机器人导航,就需要开启gazebo、move_base等多个launch,一般的做法是先ctrl+alt+T开启一个终端,随后cd到文件夹中,然后进行一遍source加入环境变量,随后用roslaunch启动gazebo仿真环境,接着再ctrl+shift+T再开一个终端,但新开的终端又要重新source一遍加载环境变量,然后roslaunch加载move_base导航。这无疑会造成时间上的浪费,有这时间我都能看完一章小说了。
但如果采用sh文件,我们只需要编写4行命令就行了,如下:
#!/bin/bash
gnome-terminal --tab -- bash -c "source devel/setup.bash;roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch"
sleep 20s
gnome-terminal --tab -- bash -c "source devel/setup.bash;roslaunch mbot_navigation nav_cloister_demo.launch"
在执行编写的sh文件时最好采用的命令是:
bash xxx.sh # 其中xxx是你sh文件的文件名
一般有人执行sh文件要么就是 ./xxx.sh 或者是 sh xxx.sh ,我试过之后发现对于上面我自己的sh文件来说是执行不通的,会报错,具体原因我没有细究,毕竟能用就行。
这边分别解释一下每一行的作用,第一行:
#!/bin/bash
类似于ubuntu中用Python文件需要在最顶部加上# coding=utf-8,具体不用细究,看第二行:
gnome-terminal --tab -- bash -c "source devel/setup.bash;roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch"
其中 gnome_terminal --tab – bash -c 就是开启一个新终端,然后在新终端中需要输入的命令为引号中的内容,其中每一个分号代表一个命令,比如source devel/setup.bash就是加载环境变量,这个时候分号的作用就类似于暂停符,只有执行完这个命令了,才会继续执行下面的roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch,打开gazebo。这里需要注意的是如果执行某个命令报错了,那么新终端会自动关闭,就相当与闪退,所以如果当你启动sh文件但是发现没有新的终端启动,你应该找的是自己文件是否有问题。
第三行:
sleep 20s
很明显,这里的意思就是执行到这一行后先停止20秒,原因是在开启gazebo的时候有时候快有时候慢,但过慢会导致当gazebo还没有启动成功就开起了move_base导航,导致后续的nav_cloister_demo.launch报错,所以这里的时间可以给长一点,当然可以自己定。
第四行:
gnome-terminal --tab -- bash -c "source devel/setup.bash;roslaunch mbot_navigation nav_cloister_demo.launch"
一样是开启一个新终端并且启动move_base导航,原理跟上面是一样的。然后回顾这四行命令我们可以猜到,到目前为止一共开启了三个终端,第一个终端是人为开启的,用于执行sh文件,其它两个终端都是在执行sh文件时自动开启的。
并且我在研究时遇到了这样的一个问题,我自己写了一个python文件想创建一个功能包并写一个launch文件执行这个python文件,但由于是脚本文件,它本身修改完是不需要编译的,而且我的launch文件一直有问题,那么这个时候我就把python文件的执行也放入了sh文件中,也就是下面这行命令:
gnome-terminal --tab -- bash -c "cd src/planner_mycode/src;python main.py"
所以我又新开了一个终端专门用来执行python文件,这也是一个好方法。
自动读取密码
同时在sh文件中有时我们需要权限,免不了采用sudo执行某个命令,比如开启一个串口权限,假设为:
sudo chmod 777 /dev/ttyUSB0
这里并不是简单的编写下面这种sh文件就行了:
#!/bin/bash
sudo apt-get update
password
其中password是你的密码,因为它在执行到第二行的时候会等你输入完密码再执行到 password这一行,说白了就还是要人为输入密码,那这边介绍一种自动读取密码的功能:
#!/bin/bash
sudo -S apt-get update << EOF
password
EOF
首先在sudo后面要加上-S,具体原因不详细阐述,然后是两个小于号加EOF,这里的意思就相当于当执行到EOF这里时,后续的输入会作为子命令,直到遇到第二个EOF为止,所以这里的 password就是sudo -S apt-get update的子命令,也就是密码。
|