エクスポート後、関数の外部でローカル変数を使用することはできません。

エクスポート後、関数の外部でローカル変数を使用することはできません。

これは私のスクリプトです。エクスポートコマンドを使用してもブロック外の変数は使用できません。以下は私が試したコードです。などの他のオプションを試しましたが、declare -x varそれも動作しません。誰でもこれについてコメントできますか?私は正しくしていますか?

#!/bin/bash
{
    var="123"  
    export var   # exporting the variable so that i can access from anywhere   
    echo "var is "$var     # able to get the value of this variable
} | tee   log.txt

echo "var is "$var   # not able to get the value of this variable

答え1

~によるとこれ許可されたSOF回答:

パイプでは、すべてのコマンドが異なるプロセス(stdout / stdinがパイプを介して接続されている)で同時に実行されます。

したがって、中括弧自体はサブシェルを生成しませんが、パイプは(bashで)実行します。

#!/bin/bash
var=256

ps -u | grep $0
{
ps -u | grep $0
{
var="123"  
export var
echo "var is "$var

ps -u | grep $0

} | tee log.txt
echo "var is "$var
}

echo "var is "$var

したがって、私たちが望むのは、画面とログファイルに出力を引き続きインポートしながらパイプを使用しないようにすることです。幸いなことに、bashには<(...)一時的なFIFOを生成する機能があります。次の例は、コードブロックを引き続き使用でき、出力全体をログにパイプして(別のログファイルに追加)、サブシェルを入力しなかったため、後で変更された変数にアクセスできる可能性を示していstdoutますstderr

#!/bin/bash

VAR=123
echo "VAR first: $VAR"

{
        VAR=256
        echo "VAR in block: $VAR"
        norealcommand
        # show open files to see FIFOs
        #lsof -p $$
        date
        otherbadcommand
}> >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)

# dummy output to not mess up output order
echo | cat 

#lsof -p $$
echo "VAR after block: $VAR"

cat -n stdout.log 
cat -n stderr.log

結果は次のとおりです。

$ ./fifo                                                                            /dev/shm |myself@mydesk|0|12:04:10 
VAR first: 123
VAR in block: 256
./fifo: line 9: norealcommand: command not found
Mon Jul  3 12:04:37 CEST 2017
./fifo: line 13: otherbadcommand: command not found

VAR after block: 256
     1  VAR in block: 256
     2  Mon Jul  3 12:04:10 CEST 2017
     3  VAR in block: 256
     4  Mon Jul  3 12:04:37 CEST 2017
     1  ./fifo: line 9: norealcommand: command not found
     2  ./fifo: line 13: otherbadcommand: command not found
     3  ./fifo: line 9: norealcommand: command not found
     4  ./fifo: line 13: otherbadcommand: command not found

これがあなたを幸せにしてくれることを願っています:-)

関連情報