메시지가 나타나면 명령을 실행하세요.

메시지가 나타나면 명령을 실행하세요.

나는바람둥이스크립트는 임의의 색상으로 임의의 문장을 출력합니다. 이제 명령을 입력할 때마다 실행하고 싶습니다.

나는 이것을 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.

다음은 두 가지 제안입니다.

  1. 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"'
    
  2. trap '…' DEBUG. 이미 발견했듯이 이를 통해 명령을 실행하기 직전에 명령을 실행할 수 있습니다. 문서에는 다음과 같은 내용이 있습니다 trap.

    sigspec이 인 경우 arg 명령은 모든 단순 명령, 명령, 명령, 명령, 모든 산술 명령 이전 및 쉘 함수에서 실행되는 첫 번째 명령 이전에 DEBUG실행됩니다.forcaseselectfor

    따라서 여기서 할 수 있는 일은 트랩이 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
    $
    
  3. 명령이 없을 때는 트리거되지 않습니다.

    간단한 확인을 추가하면 $BASH_COMMAND잘못된 트리거를 방지할 수 있습니다.

    trap 'cmd="$BASH_COMMAND"; [[ "$cmd" != "$PROMPT_COMMAND" ]] && echo ~/.Flirt.sh' DEBUG
    

관련 정보