【问题标题】:How to set a TCL variable as a varible in a bash script如何在 bash 脚本中将 TCL 变量设置为变量
【发布时间】:2021-05-06 17:44:50
【问题描述】:

所以我的目标是获取我的 TCL 文件中的一个变量并将其传递给我的 shell 脚本以便它能够使用。现在,我可以回显以获取变量的结果,但由于某种原因,我无法将该结果设置为 bash 脚本中的变量。

这是我的 TCL 脚本示例:

set file_status "C"

这是我的 bash 脚本:

echo 'source example.tcl; foreach _v {file_status } {puts "\"[set $_v]\""}' | tclsh
file_status='source example.tcl; foreach _v {file_status } {puts "\"[set $_v]\""}' | tclsh
echo $file_status

所以上面的第一个 echo 语句有效,但是由于某种原因我设置了 file_status 变量后,第二个 echo 语句不起作用。

【问题讨论】:

    标签: bash shell tcl


    【解决方案1】:

    通常需要非常复杂的代码; Tcl 变量能够保存任意数据(包括完整的二进制数据)并且没有长度限制,而 Shell 则受到更多限制。但是对于值是没有 NUL 的纯文本的常见情况,可以做一些事情。 (C 将是这种价值的一个很好的例子。)

    当传递给子进程时,迄今为止最简单的方法是使用环境变量:

    set the_status "C"
    set env(file_status) $the_status
    exec bash -c {echo "file status is $file_status"} >@stdout
    

    这有长度限制,但非常简单。

    如果您要将变量发送到其他进程,最好的办法是编写一个小脚本(这里,我将其发送到stdout):

    puts [format {file_status='%s'} [string map {"'" "'\''"} $the_status]]
    

    这是生成一个只设置变量的脚本。 (string map 正在将单引号转换为在单引号内起作用的东西;其他一切都不需要像那样的转换。)您在 shell 中使用 evalsource/. 运行脚本(取决于是否它在字符串或文件中)。

    非常大的数据应该在文件内或通过管道移动。一般来说,它需要更多更多的思考。

    【讨论】:

      【解决方案2】:

      我会从 Tcl 输出 shell 语法并将它的源代码输入到你正在运行的 shell 中:

      给定

      $ echo 'source example.tcl; foreach var {file_status} {puts "$var=\"[set $var]\""}' | tclsh
      file_status="C"
      

      然后

      source <(echo 'source example.tcl; foreach var {file_status} {puts "$var=\"[set $var]\""}' | tclsh)
      declare -p file_status
      

      输出

      declare -- file_status="C"
      

      使用 /bin/sh,您可以:

      var_file=$(mktemp)
      echo ... | tclsh > "$var_file"
      source "$var_file"
      rm "$var_file"
      

      【讨论】:

      • 当我运行这一行时: source
      • 你的外壳是什么?是 /bin/sh 吗?进程替换&lt;(...) 是 bash 语法。
      • 如果你发现info varssource前后的区别,你甚至不需要事先知道变量名。
      猜你喜欢
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2018-05-01
      相关资源
      最近更新 更多