ROS 中setup.bash

2023-05-16

好久没写了,最近搞了辆小车,瞅了瞅ROS的相关内容,没有写ROS的内容,刚开始看,写的话基本就成了书本粘贴。。。不过最近由ROS引出来的一些Linux相关的东西,然后又回头撸了撸私房菜,还是有一些收获的。

先说一下此篇的起因,就是在创建了ROS 的workspace之后,需要将workspace中的setup.bash文件写入~/.bashrc 文件中,让其启动:
就像这个样子:

source /opt/ros/kinetic/setup.bash

这句的目的就是在开新的terminal的时候,运行这个setup.bash,而这个setup.bash的作用是让一些ROS* 开头的命令可以使用。同时还能够创建一些ROS开头的环境变量,比如:

ROS_PACKAGE_PATH

这个环境变量是一堆路径字符串:

ROS_PACKAGE_PATH="/opt/ros/kinetic/share"

用来表征ROS功能包路径,当你使用:

rospack find {packagename}

搜寻功能包所在的路径时,它会依据ROS_PACKAGE_PATH 所提供的功能包路径里去寻找,不在这个环境变量里的路径就不会去寻找了,即便你有这个功能包,也会显示找不到。

继续捯饬的过程中发现这么个现象:
假如我在~/.bashrc中加入这么一堆的source:

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash
source ~/robin_ws/devel/setup.bash

source ~/riki/tySDK/camport_ros-master/devel/setup.bash
source ~/riki/catkin_ws/devel/setup.bash

本来以为ROS_PACKAGE_PATH 会依次增加,把每一个功能包的路径都添加上,但是发现不是,貌似会有干扰。就是只有第一句的时候,ROS_PACKAGE_PATH="/opt/ros/kinetic/share" 加上后面的之后会变化,并不是加一句,增加一条,而是没有什么规律。。。
比如我只有这两句:

source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

的时候ROS_PACKAGE_PATH 是这样的:

robin@robin:~$ echo $ROS_PACKAGE_PATH
/home/robin/catkin_ws/src:/home/robin/robin_ws/src:/home/robin/riki/tySDK/camport_ros-master/src:/opt/ros/kinetic/share

但是,我再加一句:

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash
source ~/robin_ws/devel/setup.bash

再source一下:

robin@robin:~$ echo $ROS_PACKAGE_PATH
/home/robin/robin_ws/src:/home/robin/riki/tySDK/camport_ros-master/src:/opt/ros/kinetic/share

我的/home/robin/catkin_ws/src 竟然没了?!
一头雾水,猜测是不是这样source好多,他们之间会干扰,于是打开上面的setup.bash文件,看看究竟:

#!/usr/bin/env bash
# generated from catkin/cmake/templates/setup.bash.in

CATKIN_SHELL=bash

# source setup.sh from same directory as this file
_CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)
. "$_CATKIN_SETUP_DIR/setup.sh"

整个_CATKIN_SETUP_DIR 其实就是获得当前正在执行的脚本的所在路径,然后第二句执行一下同路径下的setup.sh文件。
主要来解析一下这一句:

_CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)

一步步拆解:
1、首先最内层的:${BASH_SOURCE[0]}
参见:https://www.cnblogs.com/sunfie/p/5943979.html
总体来说就是:BASH_SOURCE[0] , 取得当前执行的shell文件所在的路径及文件名。
举个栗子:比如你在~/test中有个test.sh文件,文件中有这么一句:echo ${BASH_SOURCE[0]}
运行结果是这样的:

robin@robin:~$ ./test/test.sh 
./test/test.sh

会输出路径加文件名。

2、"${BASH_SOURCE[0]}"
这句会把双引号内的东西全部转换成字符串。不过这里貌似${BASH_SOURCE[0]} 的结果输出本身就是字符串吧。。。

3、dirname "${BASH_SOURCE[0]}"
参考:http://man.linuxde.net/dirname
总结就是去除字符串中的文件名称,只留路径部分。测试一哈,还是我们的~/test中有个test.sh文件,文件中之前的那句改一改:

echo `dirname ${BASH_SOURCE[0]}`

输出结果变为:

robin@robin:~$ ./test/test.sh
./test

只有test.sh所在的路径了。

3

`dirname "${BASH_SOURCE[0]}"`

这步比上面多了对反引号。
参考:http://blog.csdn.net/jackyechina/article/details/52813007
总结就是:【`】,学名叫“倒引号”, 如果被“倒引号”括起来, 表示里面需要执行的是命令。
因为整个整体在双引号中,若不夹这个反引号,diename会被变成字符串,加上倒引号后,表征倒引号中的内容是一行命令,主要是指dirname命令

"`dirname "${BASH_SOURCE[0]}"`"

4

builtin cd "`dirname "${BASH_SOURCE[0]}"`"

参看:http://man.linuxde.net/builtin
主要意思就是使用shell内建的cd命令进入当前脚本所在的目录。

5

builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null

此步多了个 > /dev/null
参看:https://zhidao.baidu.com/question/223779994.html
大概意思就是不要输出任何东西吧,我猜的。。。

6

&&

参看:http://blog.csdn.net/a627088424/article/details/20360107
前一条执行成功后,执行后面的命令。

7 pwk
参看:http://man.linuxde.net/pwd
显示用户当前工作目录的绝对路径。

_CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)

所以整个语句流程就是取得本shell的绝对路径和名称,然后dirname去掉名称只留路径,然后进入此路径,同时将cd 的输出扔掉,不予显示。然后这步执行成功的话pwk出绝对路径然后赋值给_CATKIN_SETUP_DIR变量。

巴特!搞了这么久貌似还是没有找到为什么source之间会干扰。。。
后来又查询到底如何正规的修改环境变量:

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/robin/catkin_ws/src

直观上就是将环境变量再赋值一下,并在后面接上一段。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS 中setup.bash 的相关文章

  • 如何使用管道字符分隔符分隔字段

    我知道这个问题已经被问过 但我发现没有一个解决方案对我有用 我有一个程序 其输出如下 COUNT 293 1 lps 我对第二个字段感兴趣 但是这些尝试都没有成功 spawn 1 cut d f2 spawn 1 cut d f2 spaw
  • /bin/bash printf 不适用于 C 以外的其他 LANG

    我对 bin bash 和使用 printf 格式化字符串的脚本有一个非常奇怪的问题 我的脚本看起来像这样 rt printf 3f 13 234324245 不同之处在于 我计算出上面的数字 13 23 当我使用 usr bin zsh
  • 在 bash 中将 kB 和 GB 转换为 MB

    我使用 awk 和 sed 来获取表中的分区列表及其大小 我想用它来计算各个表的每日增量 这是我的输出 现在我正在努力将所有大小转换为 MB 匹配第二个字段中的数字并根据 MB 或 GB 字符串相乘的最佳 bash 方法是什么 201706
  • seq 使用逗号作为小数点分隔符

    我注意到一个奇怪的现象seq我的一台计算机 Ubuntu LTS 14 04 上的行为 不是使用点作为小数点分隔符 而是使用逗号 seq 0 0 1 0 2 0 0 0 1 0 2 我的另一台 PC 上相同版本的 seq 8 21 给出了正
  • brew install python,但随后:“python-2.7.6 已安装,只是未链接”

    免责声明 菜鸟 操作系统 10 8 5 当我在 bash 中安装 python 时 我得到了这个警告和错误 https i stack imgur com TBgBT png Warning Could not link python Un
  • 在 MacOS 上重新启动终端而不关闭

    如何在不关闭窗口的情况下重新启动当前的 MacOS 终端会话 在Linux中我使用exec bash但在这种环境下它不起作用 我对 bash profile 提示 别名等 我想在不关闭它并再次打开的情况下查看 只需输入命令 exec bas
  • 如何在 bash 脚本中使用并行编程/多线程?

    这是我的脚本 bin bash script to loop through directories to merge fastq files sourcedir path to source destdir path to dest fo
  • Cron 不会导入 pandas 模块来执行 python 脚本。 ```导入错误:没有名为 pandas 的模块```

    我使用的是xubuntu 18 01 我有一个 python 程序 可以抓取天气数据并将文件保存为 csv 运行命令完美运行weatherdata在我授予它许可后 在终端中使用chmod x weatherdata 我希望使用 cron 每
  • 操作系统和元操作系统有什么区别

    最近听到这个词元操作系统当我学习ros时 你能帮我区分一下吗操作系统 and 元操作系统 ROS 是什么和不是什么最好的解释是这张纸 http www robotics stanford edu ang papers icraoss09 R
  • 向后台进程发送命令

    我有一个先前运行的进程 process1 sh 它正在后台运行 PID 为 1111 或其他任意数字 我怎样才能发送类似的东西command option1 option2PID 为 1111 的进程 I don t想要启动一个新的proc
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 通过 bash 命令设置 gitlab-ci.yml 变量

    variables CUSTOM NODE VERSION cat nvmrc 我想要变量CUSTOM NODE VERSION通过内容填充 nvmrc文件 位于项目根目录中 如何在gitlab ci yml file 上面的例子不起作用
  • bash 子 shell 中出现陷阱“kill 0”的分段错误

    我正在尝试编写一个并行构建多个 Dockerfile 的小脚本 但是如果我想取消该脚本 我也想杀死子进程 这样做的结果是segmentation fault 不知道为什么 为了澄清我正在杀死脚本 C trap kill 0 SIGINT S
  • Bash - 将键绑定到字符串(不是函数)

    如何获得键绑定以导致在命令行插入任意文本 在 zsh 中我这样做 bindkey s m myspecialscript 在 bash 中 有等效的吗 没有一个内置函数可以实现我想要的功能 bind e E home yourscript
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任

随机推荐

  • 使用VNC可视化Docker容器

    使用VNC可视化Docker容器 0 前言环境 xff1a 1 容器端配置1 1 启动Docker容器1 2 安装x111 3 安装桌面环境1 4 安装tightvncserver 2 配置VNC Server2 1 首先停止刚刚新建的虚拟
  • STM32 串口ISP下载方式解读

    xfeff xfeff http blog sina com cn s blog b09739ab0102v4rm html Flash Loader Demonstrator 下 载工具的安装 1 xff0e 硬件的连接和设置 串口ISP
  • with异常处理

    class A 39 39 39 此类的对象可以用 xff57 xff49 xff54 xff48 语句进行管理 39 39 39 def enter self print 34 已经进入with语句 34 return self def
  • telegram android 源码分析 (一)自动设置代理

    比如自动设置mtproxy代理 xff0c 冗长的代码我们怎么去找 xff1f 1 xff09 首先我们发现点代理链接能弹对话框 xff0c 们可以在strings xml中搜索得到 xff1a lt string name 61 34 U
  • NS3 的 ipv4-static-routing-test-suite 源码分析

    下面进行源码注释 xff1a End to end tests for Ipv4 static routing include 34 ns3 boolean h 34 include 34 ns3 config h 34 include 3
  • c语言向上取整计算方法

    用整数N 除以 M xff0c 要求向上取整数 1 xff09 int n 61 N 43 M 1 M xff1b 简化后就是 xff1a 2 xff09 int n 61 N 1 M 43 1 xff1b 最笨的办法 3 int n 61
  • 比std::qsort还快的快速排序(1千万整数1.7秒)——(快速排序栈溢出与递归优化)

    前几天发现老外的开源项目中事件队列中用的就是std qsort排序 xff0c 后续插入时候使用了堆方式 快速排序实际应用中是比堆排序要快的 xff0c 这主要是因为硬件层次会对数据执行高速缓存 xff0c 数据使用一二三级高速缓存比访问内
  • C#使用ProtoBuf

    1 Google ProtoBuf 经过测试 xff0c protobuf比json存储效率还是要高 xff0c 即时号称最快的fastjson也没有protobuf快 xff0c 这里为了使用 c 做一个客户端兼容 xff0c 所以也需要
  • 多线程如何实现高性能计数器(无锁)

    多线程协作免不了使用计数器 xff0c 通常的代码 xff0c c 43 43 一般会使用锁 xff0c 或者原子变量操作 xff1a std mutex mutexCounter int count void add std lock g
  • ubuntu18/20 下如何生成core文件

    ubuntu18 20 下如何生成core文件 一 设置 原理 xff1a https blog csdn net Sunnyside article details 118439302 原来在ubuntu14 ubuntu16上只需要一步
  • c++的字节序与符号位的问题

    看这样一道题 xff1a include lt stdio h gt int main void int w h int i 61 0xa1b2c3d4 char p 61 char amp i for int j 61 0 j lt 4
  • docker镜像之带vnc的ubuntu

    docker镜像 之 带vnc图形界面ubuntu 前言 xff1a 为了在图形界面中使用firefox xff0c 需要找一个带rdp或者vnc的ubuntu xff0c 最好是gnome的界面 xff0c 折腾了3天 xff0c 终于找
  • STM32中,关于中断函数调用全局变量的问题

    xfeff xfeff https blog csdn net leo liu006 article details 79334905 首先是问题的描述 xff1a 硬件单片机型号 xff0c STM32F103VET6 xff0c IDE
  • python使用selenium以及selenium-wire做质量与性能检测

    python天生就是适合用来做爬虫 xff0c 结合selenium真是如虎添翼 xff1b 1 安装库 pip install selenium pip install selenium wire 2 xff09 添加驱动 xff0c 比
  • 编写http workshop脚本从网页缓存里解析音乐

    前一篇文章 编写http workshop脚本从网站下载音乐 示范了如何使用HttpClient访问API 以及Json数据的解析 今天我们通过解析一个网页展示如何使用内置的LibXml2的功能解析HTML 提取我们关心的内容 这里随便搜了
  • pytorch环境搭建若干

    备注 xff1a 不要使用python3 11不支持 xff0c pip会说找不到合适的版本 xff1b python官网不提供旧版的下载了 xff0c 说是win7以后无法使用 xff0c 都是扯淡 xff0c 有其他地方可以下载pyth
  • ffmpeg常用方法

    FFmpeg 是一款开源的音视频处理工具 xff0c 可以处理各种格式的音视频文件 xff0c 并且可以进行格式转换 剪切 合并 添加水印等多种操作 下面是 FFmpeg 的一些常用命令及其用法 xff1a 视频转码 将一个视频文件转换为另
  • RFC2152 UTF-7 中文

    RFC2152 UTF 7 中文 翻译 xff1a 李静南 时间 xff1a 2006 03 29 EMAIL xff1a robin fox 64 sohu com 版权 xff1a 可以用于非商业用途自由转载 xff0c 但请保留本文档
  • 第九章0.4的CMakeLists.txt结构

    最开始看这一章的时候 xff0c 将CMakeLists txt部分跳过了 xff0c 没有看 后来看高博RGBD SLAM时候 xff0c 第一讲降到了cmake的用法 xff0c 发现有新的东西 xff0c 又回头看 xff1a 最原始
  • ROS 中setup.bash

    好久没写了 xff0c 最近搞了辆小车 xff0c 瞅了瞅ROS的相关内容 xff0c 没有写ROS的内容 xff0c 刚开始看 xff0c 写的话基本就成了书本粘贴 不过最近由ROS引出来的一些Linux相关的东西 xff0c 然后又回头