![bash가 디렉토리 이름을 완성하는 방식을 구성할 수 있습니까?](https://rvso.com/image/1288703/bash%EA%B0%80%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%99%84%EC%84%B1%ED%95%98%EB%8A%94%20%EB%B0%A9%EC%8B%9D%EC%9D%84%20%EA%B5%AC%EC%84%B1%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
특정 디렉토리 이름에 대해 완성을 수행하기 위해 특별한 방법을 사용하도록 bash에 지시하고 싶습니다. 예를 들어, bash는 경로가 "$$"로 시작하면 완료를 수행하고 그렇지 않으면 정상적으로 완료를 수행하도록 내 프로그램을 호출합니다.
이것이 가능합니까? 어떻게 구현하시겠습니까?
하사품: 그 질문에 대한 답변을 주시면 정말 감사하겠습니다. 허용하는 것이 목표입니다.자동 점프사용자가 특정 접두사를 사용하여 명령을 시작할 때 모든 명령의 경로를 완성합니다. 예를 들어 먼 디렉토리에서 파일을 복사할 때 다음과 같이 입력할 수 있습니다.
cp $$patern + <Tab>
그러면 자동 점프가 완료됩니다
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
파일을 넣을 위치를 추가하기만 하면 됩니다. 물론 ott의 의견을 사용하여 몇 가지 특정 명령에 추가할 수 있지만 더 나은 아이디어가 있는 사람이 있으면 매우 감사하겠습니다.
답변1
TAB(^i)에 대한 기본 바인딩을 재정의하면 이 작업을 수행할 수 있습니다. 먼저 TAB 바인딩을 재정의해야 하고, 그런 다음 명령을 호출하는 함수를 작성해야 합니다. 마지막으로 해당 명령의 출력을 가져와서 현재 명령줄이 포함된 변수를 업데이트해야 합니다.
이 함수는 현재 명령줄을 가져와서 마지막 두 문자를 'huugs'로 변경합니다.
function my_awesome_tab_completion_function () {
set -- $READLINE_LINE
command="$1"
shift
argument="$*"
argument_length=$(echo -n $argument | wc -c)
if echo $argument | grep '^$$' >/dev/null 2>&1; then
new_argument=$(echo $argument | sed 's/..$/huugs/') # put your autojump here
else
new_argument=$(compgen -d $argument)
fi
new_argument_length=$(echo -n $new_argument | wc -c)
READLINE_POINT=$(( $new_argument_length - $argument_length + $READLINE_POINT ))
READLINE_LINE="$command $new_argument"
}
예를 들어 new_argument 줄을 다음과 같이 변경하고 싶을 것입니다.
new_argument=$(autojump $argument)
이제 ^i 바인딩을 재정의하세요.
$ bind -x '"\C-i"':'my_awesome_tab_completion_function'
이제 작동하는지 테스트해 보세요.
$ cd /ro<TAB>
changes my command to:
$ cd /root
정상적인 완료가 여전히 작동하므로 cd $$... 등을 수행하여 $$ 부분을 테스트할 수 있습니다.
문제가 발생하면 상세 모드를 켜세요.
$ set -x
함수가 수행하는 모든 내용이 인쇄됩니다.
bash 4.2.8(1)-release(기본값)를 사용하여 Ubuntu 11에서 이것을 테스트했습니다.
답변2
Bash 완료 루틴은 쉘 스크립트로 프로그래밍할 수 있습니다.
$$[Tab]
다음은 매개변수를 로 대체하는 쉘 스크립트의 예입니다. my replacement string
단, 특정 명령에 대해서만 mycommand
그리고 매개변수가 정확히 "$$"인 경우에만 해당됩니다.
_mycomplete()
{
if [ ${COMP_WORDS[COMP_CWORD]} == \$\$ ]
then
COMPREPLY='my replacement string'
fi
}
complete -o default -o bashdefault -F _mycomplete mycommand
source <file-name>
작동을 시작하려면 스크립트를 bash(또는 dot 명령)를 통해 소싱해야 하며 다음을 수행해야 합니다.
mycommand $$[Tab] -> mycommand my replacement string
mycommand $$$[Tab] -> mycommand $$$ (beep)
mycommand whatever[Tab] -> (will complete "whatever" in the normal bash manner)
일부 또는 모든 사용자에 대해 항상 작동하도록 하려면 다음 중 하나에 이를 포함하십시오.bash 프로필 루틴.
명령 의 문제점은 complete
매개변수로 지정된 하나 이상의 명령 이름에 대해서만 작동한다는 것입니다. 사용자가 사용할 수 있는 모든 명령 목록을 간단히 제공할 수도 있고, 절박한 경우에는 확장할 수도 있습니다 /bin/* /usr/bin/* ~/bin/*
.
CentOS 5.5에서 테스트되었습니다.
이 간단한 스크립트는 중재자 studiohack에 의해 삭제된 다른 답변에 나열된 소스를 기반으로 합니다. 관심이 있으시면 삭제 취소를 요청하세요.