在KSH中将变量从子项传递给父项

时间:2013-03-13 10:44:40

标签: variables fork ksh subroutine

我必须和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中的管道那样?

谢谢。

2 个答案:

答案 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,这会关闭孩子的管道。