尝试从 tcl 脚本提交长卷曲命令并收到奇怪的错误。
这就是代码:
exec {curl --request GET --url 'https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=sys_id' --header 'Authorization: Basic UGlQQ123456'}
couldn't execute ""curl --request GET --url 'https:/xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sys": no such file or directory
执行时:
exec {curl --help}
一切都按预期进行。
我希望:
exec {curl --request GET --url 'https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=sys_id' --header 'Authorization: Basic UGlQQ123456'}
产生错误:
couldn't execute ""curl --request GET --url 'https:/xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sys": no such file or directory
这里有两个问题。一是 Tcl 希望它执行的子进程的参数是单独的单词
exec
;这就是它的工作方式(与您的 shell 不同)。另一个是'
对于Tcl来说绝对没有任何意义; shell 使用它来做什么,Tcl 使用 {...}
(并且它们嵌套得很好)。
拨打电话的正常方式是:
exec curl --request GET --url https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=cn%3Dxyzxyz&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=sys_id --header "Authorization: Basic UGlQQ123456"
或者,更有可能的是:
set query "cn%3Dxyzxyz"
set fields "sys_id"
set url https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=${query}&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=${fields}
set auth "Basic UGlQQ123456"
exec curl --request GET --url $url --header "Authorization: $auth"
或者,更有可能,将其包装在一个过程中:
proc queryUser {user {fields sys_id}} {
global auth
set query "cn%3D$user"
set url https://xyz.service-now.com/api/now/table/x_ram_account?sysparm_query=${query}&sysparm_display_value=TRUE&sysparm_exclude_reference_link=TRUE&sysparm_fields=${fields}
exec curl --request GET --url $url --header "Authorization: Basic $auth"
}
set auth UGlQQ123456
queryUser xyzxyz
虽然我可能会使用内置的
http
包编写它并保存子进程调用。
我严重怀疑:
执行时:
exec {curl --help}
一切都按预期进行。
确实有效。我希望这能起作用:
exec curl --help
或者这个:
exec {*}{curl --help}
这是可能有些东西试图“提供帮助”,但如果是这样,它应该阻止它!混合解释级别是陷入安全麻烦的好方法。