','를 '..'로 별칭을 지정할 수 있습니까?


41

때로는 부모 디렉토리로 변경하고 싶을 때 실수 cd ,,대신을 입력 합니다 cd ... bash 가이 문장을 동일하게 고려할 수있는 방법이 있습니까? 명령에 쉼표를 사용하지 않습니다. 이상적으로에 별칭 ,,을 지정하고 싶습니다 ... 이것을 시도했을 때 작동하지 않았습니다. 왜 이것이 효과가 없었습니까? 이 문제에 어떻게 더 접근 할 수 있습니까?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
별명은 프로그램에 대한 인수가 아니라 실행할 프로그램입니다. 따라서 다음 $ ,,과 같이 불평 bash: ..: Is a directory합니다. (즉, 실행 파일이 아닙니다.)
jpaugh

5
@jpaugh : 더 명확한 방법은 : 별칭 확장은 명령의 첫 번째 "단어"에서만 발생합니다. 따라서 말했듯이 args가 아닌 명령 이름에서만 작동합니다. (그리고 당신도 할 수 없었습니다 alias 'cd ,,'='cd ..'. 글쎄, 당신은 할 수 있지만, cd\ ,,그것을 한 단어로 만들려면 그것을 실행해야 할 것 입니다.)
Peter Cordes

5
zsh를 고려하십시오. 너무, 글로벌 별명이 alias -g ,,=..하고 cd ,,당신이 그것을가 예상대로 작동합니다.
muru

1
측면 사고 : find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight

2
임호 : 이러지 마. 별명을 사용하여 인쇄상의 오류를 해결하는 것은 좋지 않습니다. 이러한 오류는 복사하여 붙여 넣은 코드 나 스크린 캐스트로 끝날 수 있습니다. 다른 호스트 나 계정에서는 작동하지 않습니다. 그리고 그러한 수정 (구현 방법에 따라 다름)으로 인해 예기치 않은 다른 디버깅 오류가 발생할 수 있습니다. 내 제안 : 명령을 잘못 입력하면 다시 입력하십시오 ;-).
jjmontes

답변:


45

ZSH :

사용 zsh alias -g ,,=".."하는 것이 필요한 것이지만 이로 인해 ","가 확장되어 모든 곳에서 확장 될 수 있습니다 cd.

보낸 사람 man zshbuiltins:

는 IF -g 플래그가 글로벌 별명을 정의; 글로벌 별명은 명령 위치에서 발생하지 않더라도 확장됩니다.

세게 때리다:

bash(질문이 태그로 지정됨)로 제한 되면 다음을 읽으십시오.

이것은 요청 된 것처럼 순수한 별명 솔루션 이지만 사용자를 좌절시키는 데 필요한 것 이상을 수행합니다 (내 게시물 끝에있는 경고 참조).

인용 man bash:

별명 값의 마지막 문자가 공백이면 별명 다음에 나오는 다음 명령 단어도 별명 확장을 점검합니다.

따라서 cd추가 공백 으로 별칭 을 지정하면 (다음 인수를 확장 할 수 있음) 별칭 이 충분 ,,합니다 ... 저것 좀 봐

alias cd='cd '
alias ,,='..'

필요한 것을 정확하게 제공합니다.

이것은 bash(및 그 alias구현)뿐만 아니라 모든 POSIX 컴파일러 쉘에도 정확합니다 . 예제를 인용 man 1p alias하십시오 (매뉴얼은 예제를 통해서만이 기능을 명시 적으로 설명하지 않습니다).

  1. 별명 이름 인 인수를 처리 할 수 ​​있도록 nohup을 설정하십시오.

           alias nohup="nohup "

경고 : @PeterCordes는 자신의 의견을 쓰므 로 이후에 쓸 때 다른 별칭 이 자동으로 확장됩니다 cd. 이 작성해야하는 cd \grep명명 된 하나의 디렉토리를 변경하려는 경우 grep그러나 당신은 grep의 별칭입니다 grep --color=auto. 백 슬래시가 없으면 cd"너무 많은 인수"오류 cd가보고됩니다 (한 번에 두 디렉토리에 둘 수 없음 ) !.


22
그것은 영리하지만 불쾌한 해킹입니다. 나는 그것을하고 싶지 않습니다. 실수로 당신을 물기에는 너무 쉽습니다. 예를 들어 일반적으로 실행하는 명령에 대한 별칭 cd이 있고 소스 코드의 디렉토리에 들어 가려고하는 경우입니다. 또는 별명과 공통 디렉토리 이름 사이의 다른 충돌. 등 cd dr으로 확장 할 cd disown -r이 별명에, 나를 위해. 어쨌든, cdIMO와 같은 기능을 사용하여 내장 기능 을 재정의하는 것이 훨씬 좋습니다 .
Peter Cordes

8
순수 별칭 솔루션의 경우 +1 (내가 배운 것). 동시에 나는 Peter의 의견에 동의합니다. 당신의 대답에 어떤 종류의 명시 적 경고가 추가되어야한다고 생각합니다.
Kamil Maciorowski

58

별명은이 작업을 수행하기위한 것이 아니지만 cdreal에 대한 랩퍼 라는 함수를 작성할 수 있습니다 cd. 이것은 나를 위해 작동합니다! 귀하 .bash_profile또는 귀하가 선택한 프로필 파일에 넣으십시오 .

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

또는 주석과 예쁜 형식으로 :

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

편집하다

@derobert if then else보다 나은 점을 지적 해 주셔서 감사 && ||합니다. 또한 이 구현은 경로가 아닌 인수 (즉 )가 첫 번째 인수가 아닌 경우에만 작동한다는 것을 깨달았습니다 ( * facepalm *) -L -P. 따라서 입력 습관이 좋지 cd -L ,,않으면 도움이되지 않습니다. 그리고 그것은 올바르게 처리하는 것이 사소한 것이 아니라고 생각합니다.


16
@ BenjiWiebe 나는 "댓글과 예쁜 서식"버전이 if-then-else와 함께 더 좋을 것이라고 생각합니다.
zwol

와우 사람들, 많은 좋은 아이디어. 수정 기능을 사용하여 필요한 수정 사항을 처리하고 있음을 확인했습니다. 나는 그것을 테스트하는 데 많은 시간을 소비하지 않았다. :)
BenjiWiebe

1
또는 $1내장 기능을 실행하기 전에 덮어 쓰기 만하면 됩니다.cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}"이거나 첫 번째 인수 후에는 아무것도 잃어 버립니다.
chepner

8
또한 기술적으로 ..첫 번째 주장 일 필요는 없습니다. cd의는 bash다양한 옵션을 취할 수 ( -P, -L, -@, -e).
chepner

29

별명은 명령 의 첫 단어 여야합니다 . 또한 별칭은 단어 로 대체해야 하므로 공백이 없어야합니다.

배쉬 참조 매뉴얼 : 별명

별명을 사용하면 간단한 명령 의 첫 단어 로 사용될 때 문자열을 단어 로 대체 할 수 있습니다 .

별명을 ..,,로 지정할 수 있습니다 cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

바로 내가하는 일입니다! : D이 두 점 / 쉼표는 입력하기가 훨씬 쉽습니다.cd ..
rav_kr

10
+1, 그것은 전혀 나쁜 생각이 아닙니다. .. Bash에서 다른 방법으로 shopt -s autocd이름을 입력하면 디렉토리를 변경할 수 있습니다. 물론 당신은 여전히 ​​별칭,,
ilkkachu


3

..디렉토리를 변경하는 또 다른 방법 은 Bash의 autocd 기능 을 활성화하는 것입니다 .

shopt -s autocd 

이름을 입력하면 자동으로 디렉토리가 변경됩니다.

~$ /tmp
cd /tmp
/tmp$ 

여전히 별명을 만들어야 ,,하지만 그저 별명으로 할 수 있습니다.alias ,,=..


2

이미있다 응용 프로그램 : 그것에 대해 스크립트 https://github.com/shyiko/commacd (스탠리 Shuyiko와 아무 제휴가).

commacd,(앞으로 점프), ,,(뒤로) 및 ,,,(뒤로 + 앞으로)의 세 가지 명령을 내 보냅니다 .

세 가지 모두 접두사로 먼저 일치하려고합니다. 결과가없는 경우에만 하위 문자열 (퍼지) 일치로 대체됩니다.

질문에 답하기 위해 스크립트 별명은 쉼표를 정의하는 세 가지 함수로 쉼표로 구분합니다.

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.