Bash에서 ...
별칭을 사용하는 방법은 무엇입니까 ../..
?
나는 다른 답변이 이것을 허용한다는 것을 알고 있지만 alias '...'='cd ../..'
다른 명령을 사용하여 디렉토리를 최대 두 수준까지 주소 지정할 수 있기를 원합니다.
cd ...
ls ...
realpath ...
나는 이것을 시도했지만 alias '...'='../..'
그것을 사용하려고 하면 다음과 같은 결과를 얻습니다.
$ alias '...'='../..'
$ type ...
... is aliased to '../..'
$ cd ...
bash: cd: ...: No such file or directory
별칭은 명령용이라는 것을 알고 있습니다. 이 경우 경로에 대해 동일한 기능을 달성할 수 있는 방법이 있습니까?
답변1
zsh로 전환할 수 있는 옵션이 있는 경우 거기에서 전역 별칭을 사용할 수 있습니다.
alias -g ...=../..
그러나 그럼에도 불구하고 ...
자체가 완전한 구분 기호로 인식되는 경우에만 확장됩니다. echo ...
또는 또는 에서는 echo ...> file
확장 되지만 또는 또는 (echo ...)
에서는 확장되지 않습니다 .)echo .../x
echo ~/...
echo "..."
bash이든 zsh이든 일반적인 csh 스타일 별칭은 명령 위치에 있는 동안이나 공백 문자로 끝나는 다른 별칭이 확장된 후에만 확장됩니다. 하지만 zsh에서는 이 옵션을 설정하면 autocd
입력 이나 다른 디렉터리가 되기 때문에 ../..
명령어 이름이cd ../..
$ set -o autocd
$ alias ...=../.. ....=../../..
$ ...
cd
로 들어가는 길이 겠지만 ../..
, 다시, alias ...='cd ../..'
또는 ...() cd ../..
.
더 좋은 방법은나는 수년 동안 그것을 사용해 왔습니다.커서 왼쪽의 내용이 끝나는 지 여부가 아니라 .삽입된 내용에 키를 바인딩 하는 것입니다 ./..
.
..
magic-dot() {
if [[ $LBUFFER = (|*[[:blank:]/]).. ]]; then
repeat ${NUMERIC-1} LBUFFER+=/..
else
zle self-insert
fi
}
zle -N magic-dot
bindkey . magic-dot
입력은 ...
즉시 시각적으로 으로 변환되고 ../..
, 다시 누르면 .로 변경됩니다 ../../..
. emacs
모드 에 있는 경우 + ..
다음에 일반적인 예 방법을 사용합니다 ( 4 번 추가).Alt4.../../../../..
/..
숫자접두사 처리.
예전에는 포함된 내용을 복사/붙여넣을 때 방해가 되는 경우가 있었는데, ...
이제는 대괄호 붙여넣기 기능이 도입되어 더 이상 문제가 되지 않습니다. 텍스트를 입력하려면 ...
세 번째 문자 앞에 +를 누르 Ctrl거나 커서 왼쪽(위)이 , , ...로 끝나지 않도록 백슬래시, 따옴표 등을 사용할 수 있습니다.v.
$LBUFFER
<blanks-or-slash>..
.\..
..\.
whatever/'...'
위의 의도적인 제한은 예를 들어 에서 확장되지 않는다는 것 sort -o...
입니다 ...
. 대신 사용하십시오 sort -o ...
. cd '.../***'
-> 마찬가지다 cd ...'/***'
. 더 많은 컨텍스트 로 확장 [[ $LBUFFER = (|*[^.]).. ]]
되도록 위의 테스트를 변경할 수 있습니다 . 단, 이렇게 하면 원하지 않는 위치로 확장될 가능성이 높아집니다....
../..
예를 들어, 최대 4개 수준(확장)을 허용하여 숫자 인수 처리를 더욱 유용하게 만들 수 있습니다.cd Alt+4.
cd
../../../..
magic-dot() {
if (( NUMERIC )) && [[ $LBUFFER = (|*[[:blank:]/:]) ]]; then
LBUFFER+=..
(( NUMERIC-- ))
fi
if [[ $LBUFFER = (|*[[:blank:]/]).. ]]; then
repeat ${NUMERIC-1} LBUFFER+=/..
else
zle self-insert
fi
}
zle -N magic-dot
bindkey . magic-dot
@Gilles가 의견에서 언급했듯이 최신 버전의 bash에는 키에 바인딩된 명령에서 라인 버퍼 편집에 대한 제한된 지원이 추가되었으므로 다음과 유사한 작업을 수행할 수 있습니다.
insert_before_cursor() {
# for the equivalent of zsh's repeat $1 LBUFFER+=$2
local i
for (( i = 0; i < $1; i++ )); do
READLINE_LINE=${READLINE_LINE:0:READLINE_POINT}$2${READLINE_LINE:READLINE_POINT}
(( READLINE_POINT += ${#2} ))
done
}
magic-dot() {
(( ${READLINE_ARGUMENT-1} > 0 )) || return
if [[ -v READLINE_ARGUMENT && ${READLINE_LINE:0:READLINE_POINT} = ?(*[[:blank:]/]) ]]; then
insert_before_cursor 1 ..
(( READLINE_ARGUMENT-- ))
fi
if [[ ${READLINE_LINE:0:READLINE_POINT} = ?(*[[:blank:]/]).. ]]; then
insert_before_cursor "${READLINE_ARGUMENT-1}" /..
else
insert_before_cursor "${READLINE_ARGUMENT-1}" .
fi
}
bind -x '".":magic-dot'
# work around a bug in current versions of bash for the numeric
# argument to work properly, that means however that you lose the
# insert-last-argument normally bound to Meta-. (also on Meta-_)
bind -x '"\e.":magic-dot'
언급한 대로 아직 작동하지 않지만 bash 4.0 이상 $READLINE_LINE
( $READLINE_LINE_BUFFER
일부 문서의 철자가 틀린 것과는 달리) 및 $READLINE_POINT
5.2 이상이 필요합니다.$READLINE_ARGUMENT
답변2
이를 위해 별칭을 사용할 수 없습니다. 별칭은 명령에 인수로 전달하는 것이 아니라 실행하는 항목에 관한 것입니다. 변수를 사용할 수 있지만 이는 약간 다른 것을 입력하는 것을 의미합니다. 그러나 짧은 변수 이름을 사용하는 경우에는 다음 두 문자만 사용할 수 있습니다.
$ pwd
/home/terdon/foo/bar
$ v="../.."
$ realpath "$v"
/home/terdon
이것이 효과가 있다면 변수 정의를 ~/.profile
또는 ~/.bash_profile
파일에 추가한 다음 셸 세션에서 액세스할 수 있습니다.
v="../.."
답변3
목표를 달성할 수 있는 방법은 다양합니다
방법 1: bash 소스 코드 수정
이 방법은 버전마다 다르지만 작업을 수행하는 좋은 방법이므로 여전히 권장됩니다. 내가 수정한 사항은 builtins/cd.def
절대 경로를 확인하기 전에 첫 번째 인수가 다음과 같이 설정되는지 확인한다는 것입니다. ( ...
별칭 처럼 들림)dirname
../..
1 단계:다운로드bash-5.1.16.tar
wget http://ftp.gnu.org/gnu/bash/bash-5.1.16.tar.gz
2 단계:패치 받기 및 적용bash_5.16_cd_two_dot.patch
tar -xf bash-5.1.16.tar.gz
cd bash-5.1.16
wget https://gist.githubusercontent.com/s0ubhik/6685effe6e46f6a840bb480c5d657933/raw/5736ce64cbb0b009d872c21f40d69c8ee2942b74/bash_5.16_cd_three_dot.patch
patch -p0 < bash_5.16_cd_three_dot.patch
3단계:컴파일 및 실행
./configure
make
./bash
방법 2: shopt에서 autocd 활성화
이 접근 방식은 원하는 대로 정확하게 수행되지는 않지만 영리한 앨리어싱 기술을 사용하는 것이 더 낫다고 생각합니다.
shopt -s autocd
이제 한 디렉토리로 돌아가려면 ..
두 디렉토리에 대해 및 를 사용하세요.../..
방법 3: 영리한 별칭 사용
이 방법은 효과적이지만 사용되는 다양한 스크립트에 문제를 일으킬 수 있으므로 권장되지 않습니다 cd
. 파일에 추가하거나 .bashrc
별도의 파일을 만들어 해당 파일을.bashrc
cd_mod(){
if [ "$1" == "..." ]; then
\cd ../../
else
\cd $@
fi
}
alias cd=cd_mod
답변4
...
인수 처럼 별칭을 직접 사용할 수는 없지만 cd
일부 사람들은 별칭을 사용하여 cd..
모든 cd ..
명령에 대해 다음과 같은 작업을 수행할 수 있습니다.
alias cd...='cd ../..'
반면에...
$ cat ~/mycd
if [ "$1" = '...' ]
then
# Use \cd to prevent recursion
\cd ../..
else
\cd "$1"
fi
그런 다음
alias cd=". ~/mycd"
또는,
mycd() { if [ "$1" = '...' ]; then \cd ../..; else \cd "$1"; fi; }
alias cd="mycd"