ros2学习笔记:shell环境变量脚本setup.bash[-z][-n][-f]参数作用

-n作用

[ -n 字符串 ] or [ 字符串 ]  字符串的长度为非零(有内容)则为真。加-n与不加-n结果相同。

-z作用

[ -z 字符串 ] 字符串的长度为零则为真。 字符串为空即NULL时为真,与上面的-n相反。

-f作用

[ -f FILE ]  如果 FILE 存在且是一个普通文件则为真。 

ros系统环境为ros2  foxy。

系统自带的包source的第一个系统脚本文件

/opt/ros/foxy/setup.bash

# copied from ament_package/template/prefix_level/setup.bashAMENT_SHELL=bash# source setup.sh from same directory as this file
AMENT_CURRENT_PREFIX=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" && pwd)
# trace output
if [ -n "$AMENT_TRACE_SETUP_FILES" ]; thenecho "# . \"$AMENT_CURRENT_PREFIX/setup.sh\""
fi
. "$AMENT_CURRENT_PREFIX/setup.sh"

通过在终端显示这个变量验证,$AMENT_TRACE_SETUP_FILES没有内容。

  [ -n "$AMENT_TRACE_SETUP_FILES" ]没有内容,if fi内代码不运行,直接跳到最后一句执行

. "$AMENT_CURRENT_PREFIX/setup.sh"

 这个脚本文件的意思是运行同一个文件夹内的setup.sh文件,转入运行下面的脚本。

/opt/ros/foxy/setup.sh

# generated from ament_package/template/prefix_level/setup.sh.in# since this file is sourced use either the provided AMENT_CURRENT_PREFIX
# or fall back to the destination set at configure time
: ${AMENT_CURRENT_PREFIX:=/opt/ros/foxy}# set type of shell if not already set
: ${AMENT_SHELL:=sh}# function to append non-duplicate values to environment variables
# using colons as separators and avoiding leading separators
ament_append_unique_value() {# arguments_listname=$1_value=$2#echo "listname $_listname"#eval echo "list value \$$_listname"#echo "value $_value"# check if the list contains the valueeval _values=\$$_listname_duplicate=_ament_append_unique_value_IFS=$IFSIFS=":"if [ "$AMENT_SHELL" = "zsh" ]; thenament_zsh_to_array _valuesfifor _item in $_values; do# ignore empty stringsif [ -z "$_item" ]; thencontinuefiif [ $_item = $_value ]; then_duplicate=1fidoneunset _item# append only non-duplicatesif [ -z "$_duplicate" ]; then# avoid leading separatorif [ -z "$_values" ]; theneval $_listname=\"$_value\"#eval echo "set list \$$_listname"else# field separator must not be a colonunset IFSeval $_listname=\"\$$_listname:$_value\"#eval echo "append list \$$_listname"fifiIFS=$_ament_append_unique_value_IFSunset _ament_append_unique_value_IFSunset _duplicateunset _valuesunset _valueunset _listname
}# iterate over all parent_prefix_path files
_prefix_setup_IFS=$IFS
IFS="
"
# this variable contains the concatenated prefix paths in reverse order
_UNIQUE_PREFIX_PATH=""# this check is used to skip parent prefix path in the Debian package
if [ -z "SKIP_PARENT_PREFIX_PATH" ]; then# find parent prefix path files for all packages under the current prefix_RESOURCES="$(\find "$AMENT_CURRENT_PREFIX/share/ament_index/resource_index/parent_prefix_path" -mindepth 1 -maxdepth 1 2> /dev/null | \sort)"if [ "$AMENT_SHELL" = "zsh" ]; thenament_zsh_to_array _RESOURCESfifor _resource in $_RESOURCES; do# read the content of the parent_prefix_path file_PARENT_PREFIX_PATH="$(\cat "$_resource")"# reverse the list_REVERSED_PARENT_PREFIX_PATH=""IFS=":"if [ "$AMENT_SHELL" = "zsh" ]; thenament_zsh_to_array _PARENT_PREFIX_PATHfifor _path in $_PARENT_PREFIX_PATH; do# replace placeholder of current prefixif [ "$_path" = "{prefix}" ]; then_path="$AMENT_CURRENT_PREFIX"fi# avoid leading separatorif [ -z "$_REVERSED_PARENT_PREFIX_PATH" ]; then_REVERSED_PARENT_PREFIX_PATH=$_pathelse_REVERSED_PARENT_PREFIX_PATH=$_path:$_REVERSED_PARENT_PREFIX_PATHfidoneunset _PARENT_PREFIX_PATH# collect all unique parent prefix pathif [ "$AMENT_SHELL" = "zsh" ]; thenament_zsh_to_array _REVERSED_PARENT_PREFIX_PATHfifor _path in $_REVERSED_PARENT_PREFIX_PATH; doament_append_unique_value _UNIQUE_PREFIX_PATH "$_path"doneunset _REVERSED_PARENT_PREFIX_PATHdoneunset _resourceunset _RESOURCES
fi# append this directory to the prefix path
ament_append_unique_value _UNIQUE_PREFIX_PATH "$AMENT_CURRENT_PREFIX"
unset AMENT_CURRENT_PREFIX# store AMENT_SHELL to restore it after each prefix
_prefix_setup_AMENT_SHELL=$AMENT_SHELL
# source local_setup.EXT or local_setup.sh file for each prefix path
IFS=":"
if [ "$AMENT_SHELL" = "zsh" ]; thenament_zsh_to_array _UNIQUE_PREFIX_PATH
fi
for _path in $_UNIQUE_PREFIX_PATH; do# trace outputif [ -n "$AMENT_TRACE_SETUP_FILES" ]; thenecho "# . \"$_path/local_setup.$AMENT_SHELL\""fiif [ -f "$_path/local_setup.$AMENT_SHELL" ]; thenif [ "$AMENT_SHELL" = "sh" ]; then# provide AMENT_CURRENT_PREFIX to .sh filesAMENT_CURRENT_PREFIX=$_pathfi# restore IFS before sourcing other filesIFS=$_prefix_setup_IFS. "$_path/local_setup.$AMENT_SHELL"# restore AMENT_SHELL after each prefix-level local_setup fileAMENT_SHELL=$_prefix_setup_AMENT_SHELLfi
done
unset _path
IFS=$_prefix_setup_IFS
unset _prefix_setup_IFS
unset _prefix_setup_AMENT_SHELL
unset _UNIQUE_PREFIX_PATH
unset AMENT_SHELL

我们自己生成的包source环境变量脚本 

工作空间内 source install/setup.bash

# generated from colcon_bash/shell/template/prefix_chain.bash.em# This script extends the environment with the environment of other prefix
# paths which were sourced when this file was generated as well as all packages
# contained in this prefix path.# function to source another script with conditional trace output
# first argument: the path of the script
_colcon_prefix_chain_bash_source_script() {if [ -f "$1" ]; thenif [ -n "$COLCON_TRACE" ]; thenecho ". \"$1\""fi. "$1"elseecho "not found: \"$1\"" 1>&2fi
}# source chained prefixes
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
COLCON_CURRENT_PREFIX="/opt/ros/foxy"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"# source this prefix
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"unset COLCON_CURRENT_PREFIX
unset _colcon_prefix_chain_bash_source_script

$0当前脚本名 $1 脚本的第一个参数 

_colcon_prefix_chain_bash_source_script(){}函数的意思是第一个参数文件存在就运行第一个参数,没有就报错。

所以我们在自己的工作空间source install/setup.bash相当于同时source /opt/ros/foxy/local_setup.bash

source install/local_setup.bash

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】指针和数组笔试题解析(2)

【C语言】指针和数组笔试题解析(1), 这是第一篇关于sizeof与strlen在指针中的应用,而这一篇主要讲解在各种情形下的灵活运用,也是大厂中经典的面试题 第一题: int main() {int a[5] { 1, 2, 3, 4, 5 };in…

AUTOSAR汽车电子嵌入式编程精讲300篇-经典 AUTOSAR 安全防御能力的分析及改善

目录 前言 研究现状 经典 AUTOSAR 概述 2.1 经典 AUTOSAR 架构 2.2 经典 AUTOSAR 应用层

Centos系统常见配置(详细)总结

目录 一、简介二、具体内容1、设置静态ip2、重启网络3、ssh登录时自动运行命令4、新增用户并创建家目录5、终端显示bash-4.2#6、更换yum源7、centos系统串口终端自动登陆8、系统启动通过rc.local自动执行脚本9、关闭防火墙10、设置samba 三、其他相关链接 一、简介 本文主要在…

uniapp 触底加载

方式一 onReachBottomDistance 缺点:需要整个页面滑动,局部滑动触发不了 { // pages.json // 路由下增加 onReachBottomDistance "path": "detailed/detailed","style": {"navigationBarTitleText": "收…

C++ 类(1)

你知道吗,C类是编程世界中的一种强大工具,它可以帮助我们更好地组织和管理代码。接下来,我将为你呈现一篇近万字的C类的教程,希望能帮助你熟悉这个概念。 首先,让我们从C类的定义开始。类是一个模板,它描述…

The ‘<‘ operator is reserved for future use. 错误解决

The < operator is reserved for future use. 错误解决 在 PowerShell 终端执行 python learnstock.py < ldata.txt 发生错误&#xff0c; The < operator is reserved for future use.解决方法&#xff0c; cmd /c python learnstock.py < ldata.txt完结&#x…

【无公网IP内网穿透】Windows搭建Web站点

什么是cpolar&#xff1f; cpolar是一个非常强大的内网穿透工具&#xff0c;开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口&#xff0c;使得公网用户可以轻松访问您的内网服务器&#xff0c;无需部署至公网服务器。支持永久免费使…

idea 无法识别vue3语法

问题描述&#xff1a; 整合了vue3.js插件能够识别到vue标准语法和html语法第三方库的语法不支持 原因 因为没配置项目根路径&#xff0c;导致无法识别配置文件 而配置文件是识别第三方库语法所必须的。 我用vite操作的&#xff0c;需要这么几个包&#xff1a; 当识别到这…

22.(地图工具篇)geoserver点服务图层SLD样式效果1

地图之家总目录(订阅之前必须详细了解该博客) 效果如下: SLD样式 <?xml version="1.0" encoding="GBK"?> <StyledLayerDescriptor version="1.0.0" xsi:schemaLocation

【Linux网络编程】Socket-UDP实例

这份代码利用下面所有知识编写了一个简易聊天室&#xff08;基于Linux操作系统&#xff09;。虽然字数挺多其实并不复杂&#xff0c;这里如果能够看完或许会对你的知识进行一下串联&#xff0c;这篇文章比较杂并且网络编程这块知识需要用到系统编程的知识&#xff0c;希望能帮助…

MyBatis配置C3P0连接池

1.在pom.xml中添加C3P0依赖 <dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.4</version></dependency>2.创建工厂类 /*** C3P0与MyBatis兼容使用的数据源工厂类*/ public class C3…

Spring Boot集成EasyExcel实现数据导出

在本文中&#xff0c;我们将探讨如何使用Spring Boot集成EasyExcel库来实现数据导出功能。我们将学习如何通过EasyExcel库生成Excel文件&#xff0c;并实现一些高级功能&#xff0c;如支持列下拉和自定义单元格样式&#xff0c;自适应列宽、行高&#xff0c;动态表头 &#xff…

lintcode 1002 · 巴士路线【中等 BFS 和825题一样】

题目 https://www.lintcode.com/problem/1002 给定一个巴士路线列表 routes. routes[i] 是第 i 辆巴士的循环路线. 例如, 如果 routes[0] [1, 5, 7], 那么第一辆巴士按照 1 -> 5 -> 7 -> 1 -> 5 -> 7 ... 的路径不停歇地行进.给定 S 和 T, 问在仅仅乘巴士的情…

wpf 异步等待框

在WPF中&#xff0c;你可以使用异步任务和UI线程分离的方式来创建一个等待框&#xff0c;以便在后台执行任务时显示一个等待消息或进度条。这有助于保持应用程序的响应性。你可以使用Task和async/await来实现异步操作&#xff0c;并使用WPF的控件来显示等待消息或进度。 以下是…

从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)

可变参数及Collections类 1. 可变参数2. Collections类2.1 Collections常用功能2.2 Comparator比较器 3. 综合练习练习1&#xff1a;随机点名器练习2&#xff1a;带概率的随机练习3&#xff1a;随机不重复 练习4&#xff1a;集合的嵌套 4. 斗地主发牌4.1 案例介绍4.2 案例分析4…

Open3D 点云配准——可视化匹配点对之间的连线

点云配准 一、算法原理1、概述2、主要函数二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、概述 可视化源点云和目标点云中匹配点对之间的连线,这对于点云配准,尤…

【AI语言大模型】星火使用介绍

一、前言 现在AI语言大模型是百花齐放,挺好!有竞争,有发展,才能推出更好的产品。现在,科大讯飞就推出了大语言模型——星火!能够学习和理解人类的语言,进行多轮对话,回答问题,高效便捷地帮助人们获取信息、知识和灵感。星火在对话栏设置了三个插件:文档回答、PPT生成…

web项目相关问题

为什么使用线程池 因为频繁地创建和销毁线程开销太大&#xff1b;当你需要限制你应用程序中同时运行的线程数时&#xff0c;线程池非常有用。因为启动一个新线程会带来性能开销&#xff0c;每个线程也会为其堆栈分配一些内存等。为了任务的并发执行&#xff0c;我们可以将这些…

unity 使用声网(Agora)实现语音通话

第一步、先申请一个声网账号 [Agora官网链接]&#xff08;https://console.shengwang.cn/&#xff09; 第二步在官网创建项目 &#xff0c;选择无证书模式&#xff0c;证书模式需要tokenh和Appld才能通话 第三步 官网下载SDK 然后导入到unity&#xff0c;也可以直接在unity商店…

Linux界的老古董

Slackware 是由 Patrick Volkerding 制作的 Linux 发行版&#xff0c;从 1993 年发布至今也一直在 Patrick 带领下进行维护。7 月 17 日&#xff0c;Slackware 才刚刚过完它 24 岁的生日&#xff0c;看似年纪轻轻的它&#xff0c;已然是 Linux 最古老的发行版。 Slackware 的发…