Bash에서 변수를 임시로 선언합니다.

Bash에서 변수를 임시로 선언합니다.

예를 들어 Bash 스크립트 파일(Bash 함수 아님)에서 Bash에서 변수를 선언하려면 다음을 수행 x=y하고 해당 스크립트 파일에서 변수 사용이 끝나면 다음을 수행합니다 unset x.

5분 후에 변수를 한 줄로 설정 해제하는 방법(함수를 사용하지 않고)이 있습니까? 한 가지 가능한 접근 방식은 다음과 같습니다 x=y && echo "unset x" | at now + 5 minutes.

이 특별한 경우에는 터미널에서 직접 스크립트 파일을 실행했습니다.복사 및 붙여 넣기해당 콘텐츠는 GitHub에서 터미널로 흐릅니다. 이것은 다음에 속한다구입나는 가정한다".


GitHub를 사용한다는 점을 감안할 때 또 다른 옵션은 다음과 같습니다.원본다음과 같이 별도의 셸을 사용하여 GitHub에서 직접 스크립트 파일을 작성 bash하지만 이 방법은 불가지론적일 수 없기 때문에 마음에 들지 않습니다 user/repo/branch/path/file.

wget -O - https://raw.githubusercontent.com/<username>/<repo>/<branch>/<path>/<file> | bash

답변1

at작업은 다른 컨텍스트에서 실행되고 현재 셸에 영향을 주지 않기 때문에 사용할 수 없습니다 .

하지만 우리도 비슷한 일을 할 수 있습니다. 이 코드는 우리가 포착하고 조치를 취할 수 있는 경고 신호를 트리거합니다.

#!/bin/bash

x=100

trap 'unset x' SIGALRM

mypid=$$

( /bin/sleep 3 ; kill -ALRM $mypid) &

for a in 1 2 3 4 5 6
do
  echo Now x=$x
  sleep 1
done

이 예에서는 필요에 따라 지연을 선택할 수 있는 3초만 사용하는 솔루션을 보여줍니다.

실행 중:

Now x=100
Now x=100
Now x=100
Now x=
Now x=
Now x=

한 줄로 쉽게 만들 수 있습니다 ;...

답변2

틀림없이:

trap 'unset x; trap - USR1' USR1; { sleep 5m; kill -USR1 $$; } &

이는 USR1 신호에 트랩을 설정한 다음 (세미콜론 치트를 사용하여 한 줄에 배치) sleep 및 kill 명령을 백그라운드 작업에 결합합니다. 작업이 완료되면 트랩을 실행하는 현재 셸에 USR1 신호를 보냅니다. 함정이 해제 x되고 함정이 제거됩니다.

기능이 없습니다!

답변3

수정된 질문의 경우 스크립트가 아닌 명령줄을 기반으로 하는 가장 간단한 해결책은 다음을 사용하는 것입니다.서브쉘당신의 일을 하십시오.

예를 들어

$ bash
$ x=100
$ echo $x
100
$ exit
$ echo $x

$

bash이 셸을 실행하고 호출하는 사이에 설정한 모든 변수는 exit잊혀집니다.

wget ... | bash이는 "붙여넣기"/입력 명령을 잘라낼 수 있다는 점을 제외하면 위젯 작동 방식과 매우 유사합니다 .

답변4

실제로 가장 쉬운 방법은 아마도 처음에 변수 선언이 있는 복합 명령을 사용하는 것일 것입니다.

명령줄 시작 부분에서 변수를 선언하면 해당 명령의 범위 내에서만 일시적으로 정의됩니다.

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y bash -c 'echo $x'
y
madumlao@lezard:~$ echo $x
foo

보시다시피, 변수 선언이 있는 줄은 해당 줄의 환경에서만 변수를 설정합니다.

다음은 작동하지 않습니다.

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y echo $x

madumlao@lezard:~$ echo $x
foo

두 번째 줄의 $x는 실제 할당 전에 명령줄 구문 분석 중에 구문 분석되므로 예기치 않게 비어 있습니다!

관련 정보