Linux Source命令和 ./的区别

本文深入解析了sourcefilename、shfilename和./filename三种方式在执行Shell脚本时的不同之处,包括如何在当前目录下执行脚本、是否创建子shell以及环境变量的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

source filename 与 sh filename 及./filename执行脚本的区别在那里呢?
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
<think>我们正在讨论的是Linux/ROS环境中的source命令,特别是针对source./devel/setup.bash的作用。根据用户提供的引用内容,可以看出用户遇到了重复添加source命令.bashrc文件的问题,并且想了解这个source命令的具体功能。需要解释source./devel/setup.bash在ROS开发环境中的作用。在ROS开发中,当我们构建一个工作空间(例如使用catkin_make)后,会在工作空间的devel目录下生成一个setup.bash脚本。这个脚本的作用是设置当前工作空间的环境变量,使得ROS的相关命令能够识别该工作空间中的包、节点等。具体来说,执行source./devel/setup.bash会:1.将当前工作空间的路径添加到ROS_PACKAGE_PATH环境变量中,这样ROS命令(如rosrun,roslaunch)就能找到这个工作空间中的包。2.设置一些与构建系统相关的环境变量,比如CATKIN_SETUP_UTILS_ARGS等。3.如果工作空间中包含消息服务,它还会生成并添加消息服务的运行时依赖。在用户提供的引用中,提到通过将source命令添加到.bashrc文件中,可以避免每次打开终端都需要手动source的问题。因为.bashrc会在每次打开新的bash终端时自动执行。但是,需要注意的是,如果多次执行echo"source...">>~/.bashrc,就会导致.bashrc文件中出现重复的source行。这虽然不会导致错误(因为重复source同一个文件是安全的),但会减慢终端启动速度,而且不够优雅。另外,引用[1]中用户遇到了一个错误提示,这是因为在.bashrc中写入的路径不正确(可能是路径中有空格或者路径不存在)。注意在引用[1]中,用户写的是:source~/catkin_ws/devel/setup.bash而错误信息是:bash:source~/catkin_ws/devel/setup.bash:Nosuchfileordirectory这里有一个明显的错误:在source路径之间缺少空格,应该是用户写成了“source~”(连在一起)了。但用户说是因为多次添加导致重复,而错误可能另有原因(比如路径中的目录不存在)。总结用户问题:source./devel/setup.bash的作用是设置ROS工作空间的环境,使得后续ROS命令可以工作。为了避免每次打开终端都手动执行,可以将其添加到.bashrc文件中,但要注意路径正确且避免重复添加。下面我将按照要求用中文回答,并添加LaTeX格式(如果有数学表达式的话,但这个问题中可能没有,所以可能用不上数学表达式,但如果有变量描述,我们会用$...$)生成相关问题。</think> ### `source ./devel/setup.bash` 在ROS/Linux环境中的作用分析 在ROS开发环境中,`source ./devel/setup.bash` 命令承担着**关键的环境配置功能**,其主要作用执行流程如下: #### **核心功能实现** 1. **工作空间环境初始化** - 加载当前ROS工作空间(如`~/catkin_ws`)的编译结果 - 在终端会话中设置必要的环境变量: ``` $ export ROS_PACKAGE_PATH="${ROS_PACKAGE_PATH}:${workspace_path}" $ export PATH="$PATH:${workspace_path}/devel/lib" ``` 2. **功能包发现机制** - 使`rosrun`, `roslaunch`等命令能够识别工作空间内的自定义功能包 - 将工作空间的`devel/share`目录加入ROS的包搜索路径 3. **消息/服务依赖注入** - 自动加载自定义的`.msg`, `.srv`消息类型定义 - 为Python模块生成`__init__.py`文件实现模块导入 #### **系统运行原理** 通过Bash的`source`命令: ```mermaid graph TB A[source命令] --> B[解析setup.bash] B --> C[设置环境变量] C --> D[修改PATH/ROS_PACKAGE_PATH] D --> E[注册功能包] E --> F[注册消息/服务] ``` #### **典型应用场景** 1. **开发环境配置** 编译工作空间后首次使用: ```bash $ cd ~/catkin_ws $ catkin_make # 编译ROS工作空间 $ source devel/setup.bash # 激活当前工作空间环境 ``` 2. **自动化配置(通过.bashrc)** 为避免每次重启终端重复执行(如引用[2][3]所述): ```bash $ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc ``` 这会导致每次开启新终端时自动加载环境(注意避免重复添加导致冲突)[^1][^3]。 #### **常见问题处理** - **路径错误**:若报错`No such file or directory`(引用[1]),需检查: 1. 工作空间是否成功编译生成`devel`目录 2. `.bashrc`中路径是否包含多余空格(如`source~/...`应为`source ~/...`) 3. 文件权限问题:`ls -l devel/setup.bash`验证可执行权限 - **重复加载**:多次执行`echo ... >> ~/.bashrc`会导致启动缓慢,解决: ```bash $ sed -i '/setup.bash/d' ~/.bashrc # 删除旧条目 $ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc ``` > **实际应用示例**:在配置好的环境中运行节点 > ```bash > $ roslaunch my_package node.launch # 无需每次source即可执行 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值