【问题标题】:Pass variable from a child to parent in KSH在 KSH 中将变量从孩子传递给父母
【发布时间】:2013-03-01 06:08:46
【问题描述】:

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

谢谢。

【问题讨论】:

  • 这一切都取决于我们所说的 ksh 以及它的陈旧程度。如果它是围绕数据结构的现代管道是蛋糕。否则,您可能应该寻找替代子外壳的替代方法。看看 ksh 协进程。

标签: variables fork ksh subroutine


【解决方案1】:

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

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

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

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

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

ksh93 确实支持 shell协同进程

启动子进程后,父进程可以使用<& p>& p 重定向运算符连接到子进程的标准输入和标准输出。正确处理这些可能是一个挑战,因为许多操作在终止时会关闭其标准输出,这将关闭通往子节点的管道。

【讨论】:

  • 感谢您的帮助,顺便说一句,我知道什么是环境,并且我知道变量作用域是如何工作的。也许它会帮助其他人......继续思考陷阱标准输入/标准输出可能会因为语法错误捕获而变得危险......我更喜欢使用 Guru 的解决方案,因为它比这个更安全。
  • Guru 的解决方案既安全又简单。我只是想确保它不仅仅是作用域——它是一个不同的地址空间,数据只以一种方式流动。在 IPC 中,它是 shell 的管道或文件。使用 ksh93,套接字也可以正常工作。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的帮助,所以我必须使用C策略来解决我的问题。顺便说一句“printenv”有点危险,我更喜欢一个一个导出变量。
猜你喜欢
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多