내보낸 후 함수 외부에서 지역 변수를 사용할 수 없습니다.

내보낸 후 함수 외부에서 지역 변수를 사용할 수 없습니다.

이것은 내 스크립트입니다. 내보내기 명령을 사용한 후에도 블록 외부의 변수는 사용할 수 없습니다. 아래는 내가 시도한 코드입니다. 와 같은 다른 옵션을 시도했지만 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

이것이 당신을 행복하게 해주기를 바랍니다 :-)

관련 정보