我必须和KSH一起工作(是的,地狱贝壳)。 我需要使用fork,子程序如下:
#!/bin/ksh
PIPE=PIPE_$$
PIPE_ERR=PIPE_ERR_$$
export TEST_FILS
$(. ./LanceFils.ksh 2>${PIPE_ERR} 1>${PIPE}) &
PID_CHILD=$!
echo "Nom du fichier PIPE: ${PIPE}"
echo "Processus fils : " $!
wait ${PID_CHILD}
echo "Code retour: " $?
echo "Sortie standard de PROC_FILS : " $(cat ${PIPE})
echo "Sortie d'erreur(s) de PROC_FILS : " $(cat ${PIPE_ERR})
echo "Contenu de TEST_FILS: ${TEST_FILS}"
rm -rf ${PIPE}
LanceFils.ksh的内容
#!/bin/ksh
TIMEOUT=5
export TEST_FILS
echo "Je suis le script fils et j'attends ${TIMEOUT} secondes"
echo "Nom du pipe du pere ${PIPE}"
sleep ${TIMEOUT}
TEST_FILS="Je suis le fils"
echo "Salut c'était bien !!!"
exit 10
我知道这不起作用,顺便说一下,我试图找到一种方法让它有效...... 在我的代码中,您可以看到我希望在子级和父级之间共享TEST_FILS变量。 在KSH中有共享变量的方法,如在perl中使用“share”或者如果我必须使用像C中的管道那样?
谢谢。
答案 0 :(得分:5)
变量可以从父shell传递到子shell,而不是相反。但是,如果您确实需要子shell中设置的值,则可以执行解决方法。
一种可能的解决方法:在子shell中,将您感兴趣的env变量及其值写入文件。返回父shell后,运行此文件,以便使用文件中设置的内容覆盖所需的env变量。您可以refer here作为示例。
答案 1 :(得分:1)
shell变量只是运行shell进程中的一块内存。环境变量是在调用另一个程序之前shell复制到其环境的变量。
要理解环境变量的局限性,必须理解进程的 environment 的概念:它是进程之间不是共享的单个内存部分,但在exec
系统调用期间将从一个进程传递到另一个进程。
(另见:Environment Variables)
环境从一个进程传递到另一个进程,后续进程可以在调用另一个程序之前更改它。
此环境也有一些限制:它只能由以空指针终止的以空字符结尾的字符串列表组成。基本上,它是一个字符串数组。
请注意,这些字符串不需要遵循VARNAME=value
结构,这是早期unix shell采用的约定。
ksh93
确实支持shell 协同进程。
启动子进程后,父进程可以使用<& p
和>& p
重定向运算符连接到子进程的stdin和stdout。正确处理这些问题可能是一个挑战,因为许多操作在终止时关闭它们的stdout,这会关闭孩子的管道。