나는바람둥이스크립트는 임의의 색상으로 임의의 문장을 출력합니다. 이제 명령을 입력할 때마다 실행하고 싶습니다.
나는 이것을 trap "~/flirt.sh" DEBUG
이 .bashrc
목적으로 사용하지만 작은 문제가 있습니다.
for i in 1; do
echo $i
done
달리다바람둥이두 번 사용하면 for i in {1..2}
출력은 스크립트의 2배와 1이 되고, 그 다음에는 스크립트의 2배와 2가 나옵니다. 예를 들어,루프의 각 명령에 대해 스크립트를 2번 실행합니다.. 명령(스크립트)을 실행하는 방법을 찾고 있습니다.한 번엔터키를 눌렀을 때앞으로내가 입력한 명령은 다음과 같이 실행을 시작합니다.
# Nothing typed so script won't be executed
$
# Script and command will be executed
$ ls
Hello from flirt.sh!
Documents Downloads
...
# Script will be executed only once
$ for i in {1..2}; do echo $i; done
Hello from flirt.sh!
1
2
어떤 제안이 있으십니까?
답변1
각 프롬프트에 대해서만 명령이 실행되기를 원한다는 점을 주석에서 명확히 했습니다. 직접적으로 확인할 수 없는 것은 bash
"Enter를 누른 후 입력한 명령이 실행되기 전에 [...] 명령을 실행하는 방법". 그러나 이 문제는 trap '…' DEBUG
.
다음은 두 가지 제안입니다.
PROMPT_COMMAND
. 이 함수는 명령을 즉시 실행합니다.앞으로모든 팁.bash
(참조)에 대한 문서man bash
는 다음과 같습니다.PROMPT_COMMAND
설정된 경우 이 값은 각 기본 프롬프트가 실행되기 전에 명령으로 실행됩니다.예
PROMPT_COMMAND='date' PROMPT_COMMAND='printf "Date: %s Id: %s\n" "$(date)" "$(id -un)"' PROMPT_COMMAND='echo "Command 1"; echo "Command 2"'
trap '…' DEBUG
. 이미 발견했듯이 이를 통해 명령을 실행하기 직전에 명령을 실행할 수 있습니다. 문서에는 다음과 같은 내용이 있습니다trap
.sigspec이 인 경우 arg 명령은 모든 단순 명령, 명령, 명령, 명령, 모든 산술 명령 이전 및 쉘 함수에서 실행되는 첫 번째 명령 이전에
DEBUG
실행됩니다.for
case
select
for
따라서 여기서 할 수 있는 일은 트랩이
Flirt.sh
각 프롬프트 후에 명령을 한 번만 실행하도록 하는 것입니다. 첫 번째 프롬프트 다음에 토글 버튼을 사용하여 다음 프롬프트가 수신될 때까지 이를 억제합니다.PROMPT_COMMAND='_trace=yes' trap '[[ "$_trace" == "yes" ]] && echo Flirt.sh; _trace=no' DEBUG
echo Flirt.sh
여기서는 스크립트 대신에 이를 사용하고 있습니다flirt.sh
.샘플 세션
$ date Flirt.sh 28 Jan 2022 16:57:51 $ for i in 1 2 3; do echo i=$i; done Flirt.sh i=1 i=2 i=3 $
명령이 없을 때는 트리거되지 않습니다.
간단한 확인을 추가하면
$BASH_COMMAND
잘못된 트리거를 방지할 수 있습니다.trap 'cmd="$BASH_COMMAND"; [[ "$cmd" != "$PROMPT_COMMAND" ]] && echo ~/.Flirt.sh' DEBUG