0

我有以下测试用例:

#!/bin/bash
tclsh <<EOF
puts "argv=$argv"
EOF

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

SYNOPSIS
    tclsh ?-encoding name? ?fileName arg arg ...?

更新:

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

tclarg1="....."
tclarg2="....."

然后我将有 tcl 的字符串变量:

SCRIPT='
    proc test{arg1 arg2} {
        some tcl commands
    }
    test ???? ????
'

最后我执行那个字符串:

tclsh <<-HERE
${POPUPSCRIPT}
HERE

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

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

4

3 回答 3

1

Heredocs 被发送到程序的标准输入,所以你的命令:

tclsh <<EOF
puts "argv=$argv"
EOF

不带参数调用 tclsh — 甚至没有文件名 — 并写入puts "argv="tclsh 的标准输入。(请注意,$argvBash 会处理这些,因此 tclsh 永远不会看到它。要解决这个问题,您需要编写<<'EOF'而不是<<EOF.)

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

由于 heredocs 被发送到程序的标准输入,因此要使用的文件名只是/dev/stdin

tclsh /dev/stdin "$tclarg1" "$tclarg2" <<'EOF'
puts "argv=$argv"
EOF

请注意,使用这种方法, tclsh 将不再.tclshrc在脚本的开头隐式运行您的脚本(因为它仅在由于没有给出任何参数而默认从标准输入读取时才这样做)。如果你需要你的任何东西.tclshrc,那么你需要明确source它:

tclsh /dev/stdin "$tclarg1" "$tclarg2" <<'EOF'
source ~/.tclshrc
puts "argv=$argv"
EOF
于 2019-06-10T16:16:54.683 回答
0
#!/bin/bash
tclsh <<EOF
puts "argv=$@"
EOF
于 2017-12-04T09:41:12.307 回答
0

这是一个棘手的小问题,因为 heredocs 对它们在命令行中的显示位置很挑剔。此外,它们最终会作为文件描述符传递给命令,因此需要一些技巧。

#!/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) "$@"

这似乎做对了。

bash$ /tmp/testArgPassing.sh a 'b c' d
argv=a {b c} d

但是,我肯定总是.tcl在考虑这种事情的时候使用单独的文件。参数操作在 Tcl 中至少与在 Bash 中一样容易,并且这样做使各种编辑器也能够提供合理的语法突出显示。

借助以下工具轻松tclsh定位右侧:PATH/usr/bin/env

#!/usr/bin/env tclsh
puts "argv=$argv"
于 2019-06-10T08:33:12.640 回答