저는 업무용으로 몇 가지 간단한 로깅 도구를 만들고 있으며, 셸에 명령을 입력할 때 발생하는 작은 문제를 해결하려고 합니다. 함수의 결과를 인라인으로 유지하면서 다른 명령의 인수로 사용하는 것을 최대한 원활하게 만들고 싶습니다. 예를 들어:
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
세 단계:
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
" 하위 명령을 사용하여 "" 변수의 값을 변경할 수 있습니다.이 이전 파일 로드
. _sudo_completions.env
.bash_profile
이 줄을 파일 에 넣을 수 있습니다그걸 써!
sudo echo --output "my_fct_log.txt" <tab> <tab>