我有以下测试案例:
#!/bin/bash
tclsh <<EOF
puts "argv=$argv"
EOF如何将参数传递给tclsh?参数必须是后的文件(如tclsh的手册页)
SYNOPSIS
tclsh ?-encoding name? ?fileName arg arg ...?更新:
首先,我将使用bash命令标志并使用它们为tclsh设置参数:
tclarg1="....."
tclarg2="....."然后,我将使用tcl拥有string变量:
SCRIPT='
proc test{arg1 arg2} {
some tcl commands
}
test ???? ????
'最后,我执行该字符串:
tclsh <<-HERE
${POPUPSCRIPT}
HERE如何将"tclarg1“和"tclarg2”传递给tcl脚本?
字符串可以来自其他来源(通过另一个文件),bash脚本也可以从多个位置/函数执行该字符串。
发布于 2019-06-10 16:16:54
Heredocs被发送到程序的标准输入,因此您的命令:
tclsh <<EOF
puts "argv=$argv"
EOF调用没有参数的tclsh --甚至没有文件名--并将puts "argv="写入tclsh的标准输入。(请注意,$argv是由Bash处理的,因此tclsh从未看到它。要解决这个问题,您需要编写<<'EOF'而不是<<EOF。)
因此,为了将参数传递给tclsh脚本,您需要传递tclsh一个文件名参数,以便您的参数可以在该文件名参数之后。
由于遗传被发送到程序的标准输入,所以要使用的文件名只是/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发布于 2017-12-04 09:41:12
#!/bin/bash
tclsh <<EOF
puts "argv=$@"
EOF发布于 2019-06-10 08:33:12
这是一个棘手的小问题,因为遗传对于它们出现在命令行中的位置非常挑剔。而且,它们最终会作为文件描述符传递到命令中,因此需要使用一些技巧。
#!/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"https://stackoverflow.com/questions/47445888
复制相似问题