1

私はKSH(ええ、その地獄の殻)で作業する必要があります。次のようなサブルーチンであるフォークを使用する必要があります。

    #!/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のように「共有」を使用して変数を共有する方法があります。または、Cのようにパイプを使用する必要がある場合はどうでしょうか。

ありがとうございました。

4

2 に答える 2

6

変数は、親シェルから子シェルに渡すことができますが、その逆はできません。ただし、子シェルで設定された値が本当に必要な場合は、回避策を実行できます。

考えられる回避策の 1 つ: 子シェルで、目的の環境変数をその値と共にファイルに書き込みます。親シェルに戻ったら、このファイルを実行して、必要な環境変数がファイルに設定されているもので上書きされるようにします。例については、こちらを参照してください。

于 2013-03-13T10:58:09.313 に答える
2

シェル変数は、実行中のシェルプロセス内の単なるメモリです。環境変数は、シェルが別のプログラムを呼び出す前にその環境にコピーする変数です。

環境変数の制限を理解するには、プロセスの環境の概念を理解する必要があります。これは、プロセス間で共有されないが、システムコール中に1つのプロセスから別のプロセスに渡されるメモリの単一セクションです。exec(参照:環境変数

環境はあるプロセスから次のプロセスに渡され、後続のプロセスは別のプログラムを呼び出す前に環境を変更できます。

この環境にも特定の制限があります。これは、nullポインターで終了する、ヌルで終了する文字列のリストのみで構成できます。基本的に、これは文字列の配列です。

これらの文字列はVARNAME=value、初期のUNIXシェルで採用されている規則である構造に従う必要がないことに注意してください。

ksh93ただし、シェルのコプロセスはサポートしています。

子プロセスを開始した後、親は<& pおよび>& pリダイレクト演算子を使用して子のstdinおよびstdoutに接続できます。多くの操作は終了時にstdoutを閉じ、子へのパイプを閉じるため、これらを正しく処理するのは難しい場合があります。

于 2013-03-14T21:09:28.813 に答える