bash를 사용하여 함수를 인라인으로 확장(실행)하여 결과를 다른 명령의 인수로 사용할 수 있습니까?

bash를 사용하여 함수를 인라인으로 확장(실행)하여 결과를 다른 명령의 인수로 사용할 수 있습니까?

저는 업무용으로 몇 가지 간단한 로깅 도구를 만들고 있으며, 셸에 명령을 입력할 때 발생하는 작은 문제를 해결하려고 합니다. 함수의 결과를 인라인으로 유지하면서 다른 명령의 인수로 사용하는 것을 최대한 원활하게 만들고 싶습니다. 예를 들어:

sudo some-command --output "<my-function>_log.txt"    <tab><tab> =>
sudo some-command --output "2021_project_a_log.txt"

특정 명령을 작성할 때 내 기능을 확장(또는 실행)하고 싶습니다. 이중 레이블은 단지 이해를 돕기 위한 것입니다. 이것이 "인라인"이라는 의미이지만 용어를 잘못 사용한 것일 수도 있습니다. 명령을 분할하고 싶지 않습니다. 즉, my-function을 실행하고 변수를 저장하거나 stdout을 사용한 다음 some-command를 입력합니다. 이러한 기능은 기본적으로 프로젝트 이름, 타임스탬프 등과 같은 메타데이터를 인쇄합니다. 이를 사용하여 다양한 명령과 도구의 출력 이름을 지정하고 저장하겠습니다.

지금까지 제가 찾은 방법은 다음과 같습니다.

  • "`my-function`_log.txt"라고 쓸 수 있어요
  • "$(my-function)_log.txt"라고 쓸 수 있습니다.

그런 다음 이 두 개를 있는 그대로 사용하거나(이 경우 먼저 확인할 수 없음) 바로가기를 사용하여 확장할 수 있지만 Ctrl + Alt + E해결 shell-expand-line하려는 문제는 다음과 같습니다.

  • 모든 기능(정상)과 모든 별칭(정상 아님)이 확장됩니다.
  • 문제가 발생할 수 있는 문자열 입력에 이러한 유형의 확장을 사용할 것이기 때문에 따옴표가 제거되었습니다.

일부 별칭은 길고 불필요하여 프롬프트가 복잡해질 수 있으므로 모든 별칭을 확장하고 싶지 않습니다.

질문:

Ctrl + Alt + E와 같이 선택한 기능만 확장하거나 커서 아래의 기능 등을 확장하는 방법이 있습니까 ? 또는 특정 별칭의 확장을 차단할 수 있나요?

감사해요!

답변1

세 단계:

  1. sudo메인 프로그램에 대한 완성 기능(당신을 위한) 파일을 정의하십시오 :_sudo_completions.env

    #! /bin/bash
    
    _sudo_completions()
    {
        local SOME_COMMAND="echo"
        if [[ "${COMP_WORDS[1]}" == "${SOME_COMMAND}" ]]; then
            if [[ "${COMP_WORDS[2]}" == "--output" ]]; then
                if [[ "${COMP_WORDS[3]}" =~ ^\"[^\"]+_log.txt\"$ ]]; then
                    CMD="${COMP_WORDS[3]%_log.txt\"}"
                    CMD="${CMD#\"}"
                    CMD_RESULT=$(${CMD})
                    COMPREPLY="\"${CMD_RESULT}_log.txt\""
                fi
            fi
        fi
    }
    
    complete -F _sudo_completions sudo
    

    물론 SOME_COMMAND" sudo" 하위 명령을 사용하여 "" 변수의 값을 변경할 수 있습니다.

  2. 이 이전 파일 로드

    . _sudo_completions.env
    

    .bash_profile이 줄을 파일 에 넣을 수 있습니다

  3. 그걸 써!

    sudo echo --output "my_fct_log.txt" <tab> <tab>
    

관련 정보