예를 들어 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는 실제 할당 전에 명령줄 구문 분석 중에 구문 분석되므로 예기치 않게 비어 있습니다!