首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过bash来向tclsh传递参数

通过bash来向tclsh传递参数
EN

Stack Overflow用户
提问于 2017-11-23 00:35:22
回答 3查看 593关注 0票数 0

我有以下测试案例:

代码语言:javascript
复制
#!/bin/bash
tclsh <<EOF
puts "argv=$argv"
EOF

如何将参数传递给tclsh?参数必须是后的文件(如tclsh的手册页)

代码语言:javascript
复制
SYNOPSIS
    tclsh ?-encoding name? ?fileName arg arg ...?

更新:

首先,我将使用bash命令标志并使用它们为tclsh设置参数:

代码语言:javascript
复制
tclarg1="....."
tclarg2="....."

然后,我将使用tcl拥有string变量:

代码语言:javascript
复制
SCRIPT='
    proc test{arg1 arg2} {
        some tcl commands
    }
    test ???? ????
'

最后,我执行该字符串:

代码语言:javascript
复制
tclsh <<-HERE
${POPUPSCRIPT}
HERE

如何将"tclarg1“和"tclarg2”传递给tcl脚本?

字符串可以来自其他来源(通过另一个文件),bash脚本也可以从多个位置/函数执行该字符串。

EN

回答 3

Stack Overflow用户

发布于 2019-06-10 16:16:54

Heredocs被发送到程序的标准输入,因此您的命令:

代码语言:javascript
复制
tclsh <<EOF
puts "argv=$argv"
EOF

调用没有参数的tclsh --甚至没有文件名--并将puts "argv="写入tclsh的标准输入。(请注意,$argv是由Bash处理的,因此tclsh从未看到它。要解决这个问题,您需要编写<<'EOF'而不是<<EOF。)

因此,为了将参数传递给tclsh脚本,您需要传递tclsh一个文件名参数,以便您的参数可以在该文件名参数之后。

由于遗传被发送到程序的标准输入,所以要使用的文件名只是/dev/stdin

代码语言:javascript
复制
tclsh /dev/stdin "$tclarg1" "$tclarg2" <<'EOF'
puts "argv=$argv"
EOF

请注意,使用这种方法,tclsh将不再在脚本开始时隐式地运行您的.tclshrc (因为只有在默认读取标准输入时才会这样做,因为没有提供任何参数)。如果您需要您的.tclshrc中的任何内容,那么您需要显式地source它:

代码语言:javascript
复制
tclsh /dev/stdin "$tclarg1" "$tclarg2" <<'EOF'
source ~/.tclshrc
puts "argv=$argv"
EOF
票数 1
EN

Stack Overflow用户

发布于 2017-12-04 09:41:12

代码语言:javascript
复制
#!/bin/bash
tclsh <<EOF
puts "argv=$@"
EOF
票数 0
EN

Stack Overflow用户

发布于 2019-06-10 08:33:12

这是一个棘手的小问题,因为遗传对于它们出现在命令行中的位置非常挑剔。而且,它们最终会作为文件描述符传递到命令中,因此需要使用一些技巧。

代码语言:javascript
复制
#!/bin/bash

# Get the script into a variable. Note the backticks and the single quotes around EOF
script=`cat <<'EOF'
puts "argv=$argv"
EOF`

# Supply the script to tclsh as a file descriptor in the right place in the command line
tclsh <(echo $script) "$@"

这样做似乎是对的。

代码语言:javascript
复制
bash$ /tmp/testArgPassing.sh a 'b c' d
argv=a {b c} d

但是,我肯定会在这样的情况下使用一个单独的.tcl文件,否则就会出现这种情况。参数操作在Tcl中至少和在Bash中一样容易,这样做使各种编辑器也能够提供正常的语法突出显示。

tclsh的帮助下,在PATH上定位正确的/usr/bin/env是很容易的。

代码语言:javascript
复制
#!/usr/bin/env tclsh
puts "argv=$argv"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47445888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档