Bash 매뉴얼 에 따르면 환경 변수 BASH_COMMAND
에는
쉘이 트랩의 결과로 명령을 실행하지 않는 한, 현재 실행 중이거나 실행 되려는 명령.
함정 코너 케이스를 제쳐두고, 올바르게 이해하면 명령을 실행할 때 변수 BASH_COMMAND
에 해당 명령이 포함된다는 것을 의미합니다 . 절대적으로 그 변수는 명령 실행 후 해제 여부를 명확하지 않다 (즉, 만 있음입니다 동안 하나가이기 때문에 "명령이 주장 할 수 있지만, 명령이 아닌 한 후, 실행) 현재 실행 중이거나 되려 실행" 방금 실행 된 명령이 아닙니다 .
그러나 확인하자 :
$ set | grep BASH_COMMAND=
$
빈. 나는 BASH_COMMAND='set | grep BASH_COMMAND='
아마 BASH_COMMAND='set'
보았을 것입니다.
다른 것을 시도해 보자.
$ echo $BASH_COMMAND
echo $BASH_COMMAND
$
글쎄요. 명령을 실행하면 echo $BASH_COMMAND
변수 BASH_COMMAND
에 문자열이 포함 echo $BASH_COMMAND
됩니다. 이번에는 왜 작동했지만 이전에는 작동하지 않았습니까?
년대하자 set
다시 일을 :
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
기다려 그것은 한 내가 그 실행될 때 설정 echo
명령을, 그리고 그것을 하지 않았다 이후 해제. 그러나 set
다시 실행했을 때 명령으로 설정 BASH_COMMAND
되지 않았습니다set
. set
여기서 얼마나 자주 명령을 실행 하더라도 결과는 동일하게 유지됩니다. 따라서 실행할 때 변수가 설정되어 echo
있지만 실행할 때는 설정되어 있지 set
않습니까? 보자
$ echo Hello AskUbuntu
Hello AskUbuntu
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
뭐? 변수 그래서 내가 실행될 때 설정 echo $BASH_COMMAND
하지만, 하지 내가 실행될 때 echo Hello AskUbuntu
? 지금 차이점은 어디에 있습니까? 변수가 현재 명령 자체가 실제로 쉘이 변수를 평가하도록 할 때만 설정됩니까? 다른 것을 시도해 봅시다. 이번에는 bash 내장이 아닌 외부 명령으로 변경을 시도했을 수 있습니다.
$ /bin/echo $BASH_COMMAND
/bin/echo $BASH_COMMAND
$ set | grep BASH_COMMAND=
BASH_COMMAND='/bin/echo $BASH_COMMAND'
$
흠, 좋아 ... 다시 변수가 설정되었습니다. 내 현재 추측이 맞습니까? 변수를 평가해야 할 때만 설정됩니까? 왜? 왜? 성능상의 이유로? 한 번 더 해보자. 우리는 $BASH_COMMAND
파일에서 grep을 시도 할 것이고 , $BASH_COMMAND
그 후 grep
명령 을 포함해야 하고 , grep
그 grep
명령을 위해 grep해야합니다 (즉, 그 자체로). 적절한 파일을 만들어 봅시다 :
$ echo -e "1 foo\n2 grep\n3 bar\n4 grep \$BASH_COMMAND tmp" > tmp
$ grep $BASH_COMMAND tmp
grep: $BASH_COMMAND: No such file or directory
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
$ set | grep BASH_COMMAND=
BASH_COMMAND='grep --color=auto $BASH_COMMAND tmp'
$
좋아, 흥미 롭군 명령 grep $BASH_COMMAND tmp
이 확장되었습니다 grep grep $BASH_COMMAND tmp tmp
(변수는 물론 한 번만 확장 됩니다) . 존재하지 않는 grep
파일에서 한 $BASH_COMMAND
번, 파일에서 두 번 grepp했습니다 tmp
.
Q1 : 현재의 가정은 다음과 같이 정확합니까?
BASH_COMMAND
명령이 실제로 평가하려고 할 때만 설정됩니다. 과- 비록 설명이 우리를 믿게 할지라도 명령을 실행 한 후에 는 설정 되지 않습니다 .
Q2 : 그렇다면 왜 그렇습니까? 공연? 그렇지 않다면, 위의 명령 순서의 동작을 어떻게 설명 할 수 있습니까?
Q3 : 마지막으로이 변수를 실제로 의미있게 사용할 수있는 시나리오가 있습니까? 나는 실제로 내에서 사용하려고했던 $PROMPT_COMMAND
때문에 빨리 내에서 같이 실행되는 명령을 분석 (어떤 물건이에 따라 작업을 수행) 할 수 있지만, 그럴 수 없어 $PROMPT_COMMAND
, 내가 변수를보고 명령을 실행 $BASH_COMMAND
변수 해당 명령으로 설정합니다. 할당이 명령이기 때문에 MYVARIABLE=$BASH_COMMAND
내 시작 부분에서 바로 할 때도 문자열 $PROMPT_COMMAND
을 MYVARIABLE
포함합니다 MYVARIABLE=$BASH_COMMAND
. (이 질문은 $PROMPT_COMMAND
실행 내에서 현재 명령을 얻는 방법에 관한 것이 아닙니다 . 다른 방법이 있습니다.)
하이젠 베르크의 불확실성 원리와 약간 비슷합니다. 변수를 관찰하면 변경됩니다.
bash
전문가가 있습니다.