1

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

谢谢你。

4

2 回答 2

6

变量可以从父 shell 传递到子 shell,而不是相反。但是,如果您确实需要子 shell 中设置的值,您可以采取一种解决方法。

一种可能的解决方法:在子 shell 中,将您感兴趣的环境变量及其值写入文件。回到父 shell 后,运行此文件,以便使用文件中设置的内容覆盖所需的环境变量。你可以参考这里的例子。

于 2013-03-13T10:58:09.313 回答
2

shell 变量只是运行中的 shell 进程中的一块内存。环境变量是 shell在调用另一个程序之前复制到其环境中的变量。

要了解环境变量的局限性,必须了解进程环境的概念:它是一段内存,不在进程之间共享,而是在系统调用期间从一个进程传递到另一个进程。exec(另见:环境变量

环境从一个进程传递到下一个进程,后续进程可以在调用另一个程序之前对其进行更改。

这个环境也有一定的限制:它只能包含一个以空指针结尾的以空字符结尾的字符串列表。本质上,它是一个字符串数组。

请注意,这些字符串不需要遵循VARNAME=value结构,这是早期 unix shell 采用的约定。

ksh93 does support shell co-processes, though.

After starting a child process, the parent can connect to the child's stdin and stdout with the <& p and >& p redirection operators. It can be a challenge to handle these correctly, as many operations close their stdout on termination, which will close the pipe to the child.

于 2013-03-14T21:09:28.813 回答