Bash에서 `...`를 `../..`로 별칭을 지정하는 방법은 무엇입니까?

Bash에서 `...`를 `../..`로 별칭을 지정하는 방법은 무엇입니까?

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 .../xecho ~/...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_POINT5.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

CD... 강타

방법 2: shopt에서 autocd 활성화

이 접근 방식은 원하는 대로 정확하게 수행되지는 않지만 영리한 앨리어싱 기술을 사용하는 것이 더 낫다고 생각합니다.

shopt -s autocd

이제 한 디렉토리로 돌아가려면 ..두 디렉토리에 대해 및 를 사용하세요.../.. 자동 디스크

방법 3: 영리한 별칭 사용

이 방법은 효과적이지만 사용되는 다양한 스크립트에 문제를 일으킬 수 있으므로 권장되지 않습니다 cd. 파일에 추가하거나 .bashrc별도의 파일을 만들어 해당 파일을.bashrc

cd_mod(){
  if [ "$1" == "..." ]; then
    \cd ../../
  else
    \cd $@
  fi
}

alias cd=cd_mod

cd_mod CD

답변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"

관련 정보