【发布时间】:2020-05-14 01:48:23
【问题描述】:
我有一个带有 first.sh 的 shell 脚本,它在内部调用了一个 python 脚本 second.py。当这个 python 脚本执行时,它会根据某些参数设置一些变量 var='yes'。
现在我需要将此 var 变量传递给它正在调用的 shell 脚本并进行一些处理。请告诉我该怎么做。
我尝试了 os.system('bash') ,但它正在创建新会话并且 shell 脚本的执行没有继续。
【问题讨论】:
我有一个带有 first.sh 的 shell 脚本,它在内部调用了一个 python 脚本 second.py。当这个 python 脚本执行时,它会根据某些参数设置一些变量 var='yes'。
现在我需要将此 var 变量传递给它正在调用的 shell 脚本并进行一些处理。请告诉我该怎么做。
我尝试了 os.system('bash') ,但它正在创建新会话并且 shell 脚本的执行没有继续。
【问题讨论】:
一个常见的模式是在父进程 (bash) 和子进程 (python) 之间使用文件描述符。在简单的情况下,只使用标准输入/输出。所以 bash 可以读取结果。像这样的:
#!/bin/bash
foo=$(python script.py)
echo "$foo"
如果您需要比单个变量更复杂的东西,您将需要决定数据的一些格式以及如何处理它(可能以 json 格式输出?)
【讨论】:
$( ... ) should be used in place of backticks,全大写名称为 defined by POSIX to be used for variables that modify shell or OS behavior 并且参数扩展应始终使用双引号,即使传递给 echo 时也是如此——参见BashPitfalls #14.
/proc/self/environ 的格式——使用NUL 分隔的key=value 对——并使用BashFAQ #1 样式的循环将它们读出并分配给关联数组。
jq,你可以输出json格式,然后使用jq解析出你关心的东西。但正如@CharlesDuffy 指出的那样,有很多方法可以做到这一点(数据编组),并且很大程度上取决于您传递的数据类型以及您拥有的工具。