TCL/Expect - exec - 如何使用参数执行程序

2024-01-12

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

% 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
%

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

Edit:

下面的例子来自扩展 Tcl 和 eval 中的参数列表 http://www.wellho.net/mouth/3583_Expanding-a-list-of-parameters-in-Tcl-and-eval.html文章让我们大开眼界,了解了这里发生的事情:

变量$action仅扩展为字符串"piemiddle apple" AFTER命令行已分为单独的参数:

% set action {piemiddle apple}
% set $action
can't read "piemiddle apple": no such variable

Result: set命令“看到”一个参数,相当于:

% set {piemiddle apple}

扩展运算符允许您指定要扩展的变量BEFORE命令行分为单独的参数:

% set action {piemiddle apple}
% set {*}$action
apple

Result: set命令“看到”两个参数,相当于:

% set piemiddle apple

在 Tcl 的早期版本中,eval 命令是推荐的替代命令,并且至今仍然可用。

% set action {piemiddle apple}
% eval set $action
apple

另一个证明扩展运算符功能的例子:

% set {*}"name Linus"
Linus
% puts $name
Linus
%
%
% set distro Unbuntu
Unbuntu
% set {*}"linux $distro"
Unbuntu
% puts $linux
Unbuntu
%
%

最后发现exec需要命令作为它的第一个参数和第一个命令选项作为它的第二个参数等等。

% exec "ls" "-la"
total 137
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
%
%
% exec "ls -la"
couldn't execute "ls -la": no such file or directory

The safest构建命令的方法exec就是用Tcl的list。例如:

% set tcl_version
8.5
% set cmd [list ls -l tmp]
ls -l tmp
% eval exec $cmd
total 32
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 file.txt
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-1.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-2.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-3.dat
% exec {*}$cmd
total 32
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 file.txt
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-1.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-2.dat
-rw-r--r--  1 pynexj  staff  1176 Jan 23 23:24 foo-3.dat
%

注意{*} http://www.tcl.tk/cgi-bin/tct/tip/293是 Tcl 8.5 的新语法,可以帮助减少使用eval.

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

TCL/Expect - exec - 如何使用参数执行程序 的相关文章

  • Mac 上的 cp --parents 选项

    在 Linux 上 我有一个可用于 cp 命令的 parents 选项 因此我可以执行以下操作 cp parents test withintest go rb test2 http www gnu org software coreuti
  • Java - Runtime.getRuntime().exec() 发生了什么?

    我在 Java 中遇到 Runtime exec 问题 我的代码 String lol home pc example txt String b touch lol try Runtime getRuntime exec b catch E
  • 如何在 {expect} 脚本中创建“循环”语句?

    假设是 这是脚本 usr bin expect set a test 我想在这个脚本中创建一个循环 以便它可以打印值 a 前面有一个基于循环的数字 所以如果我想让它循环3次 最终产品将变成 1 test 2 test 3 test 您可以使
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • (Tcl/Expect) 退出后清屏

    我想在退出我的 半 交互式期望脚本后清除屏幕 在本地计算机上 我可以在脚本中做到这一点吗 这是我尝试过的 但失败了 usr bin expect f set env TERM vt100 spawn ssh Y username domai
  • 检查 python 中命令行参数的数量

    我是蟒蛇新手 还是把脚弄湿了 我正在尝试做这样的事情 import sys if len sys argv lt 3 or lt len sys argv gt 3 print This script will compare two fi
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 使用 su 和 Expect 脚本登录用户时遇到问题

    我正在为一个班级制作一个网站 您可以使用用户名和密码登录 然后它会将您带到一个显示您在班级中的成绩的页面 该网站正在运行bash脚本 https github com jduga002 rapache 并将托管在用户已有用户名和密码登录的计
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • 可以作为命令行参数传递多少数据?

    在 Linux 下生成进程时可以发送多少字节作为命令行参数 gahooa 推荐了一篇好文章http www in ulm de mascheck various argmax http www in ulm de mascheck vari
  • 从 Node.js 调用 execl、execle、execlp、execv、execvP 或 execvp 的方法

    POSIX 系统公开了一系列exec函数 允许人们将可能不同的东西加载到当前进程中 保留打开的文件描述符 进程标识符等 可以出于多种原因执行此操作 在我的情况下 这是引导 我想更改我自己的进程的命令行选项 然后在现有进程上重新加载它 这样就
  • Ant EXEC 无法运行 bash 脚本

    我正在尝试使用 ant 来运行 bash 脚本 我发现行政指令是完成这项工作的工具 我创建了一个 bash 脚本 test sh 在我的蚂蚁目标中我添加了
  • 期待、互动,然后再次期待

    有几篇关于相同内容的帖子 但我仍然无法使我的期望脚本正常工作 我的目的是自动化一切 但保留用户输入的密码 所以脚本有 3 个部分 自动登录 给予用户交互以输入密码 将控制权交还给 Expect 脚本以继续工作 所以我有一个将生成的脚本 其中
  • TCL 中的 if 语句

    我对以下代码的 tcl 中的 if 语句有疑问 if number 1 name hello number 0 name yes do something here 上面的代码是有效的 但是如果我这样写 if number 1 name h
  • Python 对象初始化错误。或者我误解了对象的工作原理? [复制]

    这个问题在这里已经有答案了 1 import sys 2 3 class dummy object 4 def init self val 5 self val val 6 7 class myobj object 8 def init s
  • PHP 中是否有相当于 subprocess 的东西?

    在 Java 和 Python 中 你有ProcessBuilder or 子流程 https docs python org 2 library subprocess html可让您使用未转义字符串轻松启动进程的模块 例如 ls some
  • 我应该如何传递密码(包含特殊字符)作为命令行参数?

    我有一个部署脚本 必须将 LDAP 密码作为命令参数传递给该脚本 实际密码 foo ser ver 1 包含三个空格字符 开头 之前1 之后1 e g bin gt deployment bat LDAPPassword foo ser v
  • Javascript:一般访问函数参数

    这是我所拥有的 var log function arg1 arg2 console log inside arg1 arg2 var wrap function fn return function args console log be
  • 通过引用传递参数到指针问题

    每次我尝试编译代码时都会收到错误 cannot convert parameter 1 from int to int 测试代码如下所示 void set int val val 10 int main int myVal int pMyV
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2

随机推荐