linux tclsh exec cd,参数-TCL /期望-exec-如何使用参数执行程序

本文探讨了在TCLsh中使用exec命令遇到的问题,特别是当尝试执行带有参数的命令如"ls -la"时。通过示例展示了如何正确传递参数,包括使用扩展运算符和eval命令。最后,解释了exec命令需要将命令和参数分开传递的原理。

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

我正在tclsh中尝试使用TCL命令exec,这是我的结果:

% set show_me_dir "ls"

ls

% exec $show_me_dir

VboxSharedFolder

% set show_me_dir "ls -la"

ls -la

% exec $show_me_dir

couldn't execute "ls -la": no such file or directory

% set show_me_dir {ls -la}

ls -la

% exec $show_me_dir

couldn't execute "ls -la": no such file or directory

% ls -la

total 141

d---------+ 1 wakatana Domain Users 0 Jan 22 19:12 .

d---------+ 1 wakatana Domain Users 0 Apr 16 2014 ..

----------+ 1 wakatana Domain Users 20214 Jan 23 18:43 .bash_history

----------+ 1 wakatana Domain Users 1494 Apr 15 2014 .bash_profile

----------+ 1 wakatana Domain Users 7593 Jan 22 19:03 .bashrc

d---------+ 1 wakatana Domain Users 0 Jan 15 14:56 VboxSharedFolder

%

有人可以解释一下如何使用参数执行命令吗?

编辑:

仅在将命令行拆分为各个参数之后,才将变量$action扩展为字符串“ piemiddle app

<think>我们正在解决Vivado执行Tcl脚本时出现的警告:WARNING [Common 17-259] Unknown Tcl command 'vivado -source scripts/init_project.tcl' 这个警告通常是因为在Tcl脚本中直接使用了系统命令`vivado`,而Vivado的Tcl解释器并不认识这个命令。 在Vivado Tcl环境中,我们应该使用`exec`命令来调用外部程序,或者使用Vivado提供的Tcl命令。 分析: 警告信息指出:未知的Tcl命令`vivado`。这是因为在Vivado的Tcl脚本中,我们试图直接运行`vivado`这个命令,但Vivado的Tcl解释器只认识自己的Tcl命令和部分系统Tcl命令,而`vivado`是一个可执行文件,需要以外部命令的方式运行。 正确的方法: 如果我们想在Vivado Tcl脚本中启动另一个Vivado进程(通常不推荐,因为已经在一个Vivado进程中了),应该使用`exec`命令,例如: exec vivado -mode batch -source another_script.tcl 但是,根据警告信息中的命令`vivado -source scripts/init_project.tcl`,看起来是在Vivado已经启动的情况下,又试图在Tcl脚本中运行另一个vivado命令。这可能是脚本编写时的错误。 解决方案: 1. 检查命令是否应该在操作系统的终端中运行,而不是在Vivado的Tcl环境中运行。 如果是,那么应该将这条命令从Tcl脚本中移除,改为在运行Vivado之前或之后在终端中执行。 2. 如果确实需要在当前Vivado Tcl脚本中运行另一个Vivado进程(例如,批量模式运行另一个脚本),则应该使用`exec`来调用: exec vivado -source scripts/init_project.tcl 3. 另一种可能是,这个命令是用于初始化Vivado工程的,那么它应该在Vivado启动之前运行。所以,正确的做法可能是在运行Vivado之前,在终端中执行: vivado -source scripts/init_project.tcl 4. 根据引用[1]中的内容,我们注意到在chipyard项目中,初始化FPGA是通过运行`./scripts/init-fpga.sh`来完成的,然后进入fpga目录执行make命令生成比特流。所以,在chipyard的流程中,可能并不需要在Vivado中运行这个Tcl脚本,而是通过外部脚本初始化。 因此,针对这个警告,我们需要检查出现该警告的Tcl脚本,找到包含`vivado -source ...`的行,然后根据上述分析进行修改。 具体步骤: 步骤1:定位到Tcl脚本中报警告的命令行。 步骤2:判断该命令的意图: - 如果是为了启动另一个Vivado进程运行某个Tcl脚本,则改为:`exec vivado -source scripts/init_project.tcl` 注意:在Windows下,可能需要指定vivado的完整路径,或者确保vivado在系统PATH中。 - 如果这个命令本应该在终端中运行,那么就需要从Tcl脚本中移除,并调整整个流程。 步骤3:如果该命令是用于初始化工程,且项目流程中已经有一个初始化脚本(如引用[1]中的`./scripts/init-fpga.sh`),那么可能这个命令是多余的,可以删除。 根据引用[1]的流程,我们执行了`./scripts/init-fpga.sh`,这个脚本可能已经完成了初始化工作,所以在Vivado的Tcl脚本中不需要再次初始化。 因此,建议检查整个流程,确保没有重复的初始化操作。 总结:警告是因为在Vivado的Tcl环境中直接使用了系统命令`vivado`,而应该用`exec`来调用,或者将命令移到Vivado之外执行。 示例修改: 原Tcl脚本中的错误行: vivado -source scripts/init_project.tcl 修改为: exec vivado -source scripts/init_project.tcl 但是,请注意,在已经打开的Vivado中再执行一个Vivado可能会造成资源竞争,通常不建议这样做。所以,更好的做法是重新设计流程,避免在Vivado Tcl脚本中启动另一个Vivado。 如果这个命令是为了在当前Vivado中运行一个Tcl脚本,那么应该使用: source scripts/init_project.tcl 注意:`source`是Tcl命令,用于在当前解释器中运行另一个Tcl脚本。所以,如果`init_project.tcl`是一个普通的Tcl脚本,那么应该用`source`命令,而不是启动新的Vivado。 因此,需要根据`init_project.tcl`脚本的内容来决定: - 如果该脚本是用于初始化当前Vivado工程的,那么应该用`source`命令。 - 如果该脚本是独立运行一个Vivado工程(比如在后台生成比特流等),那么才需要启动新的Vivado进程(使用`exec`)。 所以,请检查`init_project.tcl`脚本的内容。 如果脚本内容类似于创建工程、添加文件等操作,那么它应该被`source`到当前Vivado会话中,而不是用一个新的Vivado进程去运行。 因此,可能的修改是: 将 `vivado -source scripts/init_project.tcl` 改为 `source scripts/init_project.tcl` 这样,就在当前Vivado进程中运行这个初始化脚本,而不会产生警告。 结论: 根据上述分析,有两种可能的修改方式: 1. 使用`exec`调用(当需要启动新进程时) 2. 使用`source`命令(在当前进程中运行脚本) 请根据实际需求选择。 如果问题仍然存在,请检查脚本路径是否正确,以及Vivado是否在系统路径中。 另外,引用[1]中提到了配置Vivado路径,所以确保已经正确配置了环境变量,使得终端可以找到vivado命令。在运行Vivado之前,执行了`source settings64.sh`(对于Vivado 2019.1)来设置环境变量。 如果是在脚本中,确保环境变量已经设置,否则`exec`可能也找不到vivado命令,这时需要写全路径,例如: exec /opt/Xilinx/Vivado/2019.1/bin/vivado -source scripts/init_project.tcl 以上是解决警告的几种方法,请根据实际情况选择。</think>### Vivado Tcl脚本警告解决方案 #### 问题分析 警告信息 `WARNING [Common 17-259] Unknown Tcl command vivado -source scripts/init_project.tcl` 表示: 1. Vivado无法识别`vivado`作为Tcl命令 2. 在Vivado Tcl环境中直接调用`vivado`可执行文件是无效的 3. 命令格式混淆了终端命令和Vivado Tcl命令 #### 解决方案 ##### 方法1:在终端运行(推荐) **直接在系统终端执行命令**,不要通过Vivado Tcl控制台: ```bash # 进入工程目录 cd /path/to/project # 直接执行Tcl脚本 vivado -mode batch -source scripts/init_project.tcl ``` * 使用`-mode batch`启用批处理模式 * 确保Vivado已加入系统PATH[^1] ##### 方法2:在Vivado Tcl中正确调用 在Vivado Tcl控制台使用`source`命令直接运行脚本: ```tcl # 在Vivado Tcl控制台执行 source scripts/init_project.tcl ``` * 不需要`vivado -source`前缀 * 脚本路径需相对于当前工作目录 ##### 方法3:通过exec调用系统命令 在Vivado Tcl脚本中使用`exec`调用系统命令: ```tcl # 在Tcl脚本中写入 exec vivado -mode batch -source scripts/init_project.tcl ``` #### 验证步骤 1. **检查Vivado路径配置** ```bash which vivado # 确认返回有效路径 # 若未配置,参考引用[1]执行: source /path/to/Vivado/2019.1/settings64.sh ``` 2. **检查脚本权限** ```bash chmod +x scripts/init_project.tcl # 添加执行权限 ``` 3. **测试脚本运行** ```bash # 直接测试Tcl脚本语法 tclsh scripts/init_project.tcl ``` #### 常见错误排查 | 错误类型 | 现象 | 解决方法 | |---------|------|----------| | 路径错误 | `no such file or directory` | 使用`pwd`确认当前目录,用绝对路径如`source $env(PWD)/scripts/init_project.tcl` | | 权限问题 | `Permission denied` | 执行`chmod +x`添加权限 | | 环境未配置 | `vivado: command not found` | 执行`source settings64.sh`配置路径[^1] | | 语法错误 | `invalid command name "vivado"` | 改用终端执行或使用`exec`调用 | #### 最佳实践建议 1. **分离执行环境**: - 工程初始化脚本 → 在终端运行 - 设计操作命令 → 在Vivado Tcl控制台运行 2. **脚本调试技巧**: ```tcl # 在Tcl脚本开头添加调试信息 puts "当前工作目录: [pwd]" puts "脚本路径: [file normalize [info script]]" ``` 3. **Makefile集成示例**(参考引用[1]): ```makefile generate_bitstream: cd fpga && \ vivado -mode batch -source ../scripts/generate.tcl && \ make bitstream ``` > **关键提示**:Vivado Tcl环境与系统终端环境有本质区别。当需要调用`vivado`可执行文件时,必须在**系统终端**执行;当需要操作当前Vivado工程时,应使用Tcl命令在**Vivado Tcl控制台**执行[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值