긴 경로에 대한 "별칭"을 만드는 방법은 무엇입니까?


95

쉘 스크립팅 중에 자주 사용하는 경로에 대한 "별칭"을 만들려고했습니다. 나는 뭔가를 시도했지만 실패했습니다.

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

어떻게 작동합니까?
그러나 cd ~/Files/Scripts/Main작동합니다.

답변:


121

환경 변수 (별칭은에서 다른 정의 bash를 가짐)이므로 다음과 같이 평가해야합니다.

cd "${myFold}"

또는:

cp "${myFold}/someFile" /somewhere/else

그러나 실제로 해당 디렉토리로 쉽게 전환하고 싶다면 실제 별칭 (예 : bash시작 파일 중 하나) 을 만드는 것이 더 쉬우 .bashrc므로 키 입력을 저장할 수 있습니다.

alias myfold='cd ~/Files/Scripts/Main'

그런 다음 (없이 cd) 사용할 수 있습니다 .

myfold

정의를 제거하려면 unalias. 다음 기록은 이러한 모든 작업을 보여줍니다 .

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found

감사. 작동합니다. 별칭 myfold = '~ / some / path'와 cd myfold 만 시도했습니다. 오류가 발생합니다-그러한 디렉토리가 없습니다. 왜 ? 또한 별칭 변수를 "할당 해제"할 수 있습니까?
bashboy jul

myfold = '~ / some / path'cd "$ myfold"실패. 왜 ?
bashboy

1
@bashboy, 아마도 그 이름을 가진 디렉토리가 없기 때문일 것입니다. ~ / some / path는 예 입니다. 사용하려는 실제 경로를 대체해야 합니다. 더 명확하게 예제 디렉토리를 사용하도록 변경하겠습니다. 별칭 할당을 해제하는 방법은 unalias 명령을 사용합니다. 나는 또한 그 명령의 사용을 포함하여 대본으로 답변을 업데이트했습니다.
paxdiablo 2013

다른 터미널 세션에서이 별칭을 어떻게 보존 하시겠습니까? 새 탭을 열고이 별칭을 사용하려고하면 작동하지 않습니다.
goldisfine

4
@goldisfine, 내 괄호 참조 in one of the bash startup files like .bashrc. 별칭을 적절한 시작 파일에 넣으면 모든 세션 에서 사용할 수 있습니다 .
paxdiablo

74

쉘 옵션이 있습니다 cdable_vars.

cdable_vars
이것이 설정되면, cd디렉토리가 아닌 내장 명령에 대한 인수 는 값이 변경 될 디렉토리 인 변수의 이름으로 간주됩니다.

이것을 추가 할 수 있습니다 .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

물결표를 $HOME; 따옴표는 물결표 확장을 방지하고 Bash는 디렉토리가 없다고 불평합니다 ~/Files/Scripts/Main.

이제 다음과 같이 사용할 수 있습니다.

cd myFold

$필요 하지 않습니다. 실제로 다른 답변에서 볼 수 있듯이 cd "$myFold"쉘 옵션없이 작동합니다. cd myFold경로에 myFold공백 이 포함 된 경우에도 작동하며 따옴표가 필요하지 않습니다.

일반적으로이 _cd기능 이 설정 되어 bash_completion있는지 확인하기 때문에 탭 자동 완성과 함께 작동 cdable_vars하지만 모든 구현이 동일한 방식으로 수행하는 것은 아니므로 bash_completion다시 소스 .bashrc(또는 /etc/profile쉘 옵션을 설정하기 위해 편집) 해야 할 수 있습니다 .


다른 쉘에는 유사한 옵션이 있습니다 (예 : Zsh ( cdablevars)).


1
ZSH에 상응하는 것이 있습니까?
라이언 스털

1
@RyanStull setopt cdablevars은 그럴 수도 있지만 zsh를 전혀 모릅니다.
Benjamin W.

@JohnMee 편집을 롤백 할 것입니다. a) zsh에서 옵션이 다르게 호출 됨 (밑줄 없음) b) Bash 태그가 지정된 질문 및 c) Bash 매뉴얼에 링크합니다. 그래도 다른 셸을 언급하는 단락을 추가하겠습니다.
Benjamin W.

1
정말 좋은 대답입니다! 대단히 감사합니다cdable_vars
Lucas P.

1
@Vladislav 함수 ( ) cd를 사용하는 bash-completion에 의해 제공되는 완료가 중단 됩니다 . 여기에 추가 하면 (변수를 완료하기 위해) 작동하지만 원하지 않는 부작용이 발생할 수 있습니다. 탭을 완료하면 완전한 환경이 표시됩니다. _cdcomplete -o nospace -F _cd cd-v
Benjamin W.

10

링크를 사용하는 것이 더 나을 수도 있습니다.

소프트 링크

심볼릭 또는 소프트 링크 (파일 또는 디렉토리, 더 유연하고 자체 문서화)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

하드 링크

하드 링크 (파일 만 해당, 덜 유연하며 자체 문서화가 아님)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

디렉토리에 대한 링크를 만드는 방법

힌트 : 집에서 링크를 볼 필요가 없으면 점으로 시작할 수 있습니다. ; 기본적으로 숨겨져 있으며 다음과 같이 액세스 할 수 있습니다.

cd ~/.myHiddelLongDirLink

9

bash의 해시 테이블에 원하는 경로를 추가 할 수 있습니다.

hash -d <CustomName>=<RealPath>

이제 cd ~<CustomName>. 영구적으로 만들려면 bashrc 스크립트에 추가하십시오 .

이 해시 테이블은 명령이 실행될 때마다 콘텐츠를 검색 할 필요가없는 bash 용 캐시를 제공하기위한 것이므로이 테이블은 캐시를 무효화하는 이벤트 (예 : 수정)에서 지워집니다 $PATH.


2
나는 그것이에서만 작동 zsh하지만에서는 작동 하지 않을 것이라고 생각합니다 bash.
sergej

이것은 IMHO의 최선의 대답이지만 zsh적어도 우분투 시스템에서만 작동하는 것은 사실 입니다.
John Stewart

6

먼저 따옴표를 제거해야합니다.

bashboy@host:~$ myFolder=~/Files/Scripts/Main

따옴표는 쉘이 $HOME디렉토리 가되는 특별한 의미로 물결표를 확장하는 것을 방지합니다 .

그런 다음 $myFolder환경 을 쉘 변수 로 사용할 수 있습니다 .

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

별칭 을 만들려면 별칭 을 정의해야합니다.

alias myfolder="cd $myFolder"

그런 다음 이러한 종류의 명령을 다음과 같이 처리 할 수 ​​있습니다.

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

당신이 아니라면 실제로 환경 변수 가 아닙니다 export.
Keith Thompson

1
@KeithThompson 좋아요, 그것은 단지 쉘 변수 입니다. 그러나 하위 프로세스에 영향을주지 않기 때문에 내보내고 싶지 않습니다. 당신은 당신의 .bashrc또는 당신이 사용하는 리소스 파일 에서 이것을 이렇게 정의하고 , 쉘 스크립트가 아닌 즉각적인 쉘에서 정의 될 것입니다.
David W.

자동 완성과 함께 작동하기 때문에이 솔루션을 선호합니다
Vassilis

5

먼저 $질문의 코드가 작동하도록하려면 "myFold"값에 액세스 해야합니다 .

cd "$myFold"

이를 단순화하기 위해 다음에서 별칭을 만듭니다 ~/.bashrc.

alias cdmain='cd ~/Files/Scripts/Main'

.bashrc현재 bash 세션에서 별칭을 사용할 수 있도록 한 번만 소싱하는 것을 잊지 마십시오 .

source ~/.bashrc

이제 다음을 사용하여 폴더로 변경할 수 있습니다.

cdmain

4

또 다른 옵션은 심볼릭 링크를 사용하는 것입니다. 즉 :

ln -s ~/Files/Scripts/Main ~/myFold

그 후에 다음 ~/myFold과 같은 작업을 수행 할 수 있습니다 .

cp some_file.txt ~/myFold

파일을 ~/Files/Scripts/Main. 를 사용하여 언제든지 심볼릭 링크를 제거 rm ~/myFold할 수 있으며 원래 디렉토리가 유지됩니다.


한 가지 단점 : 당신이 경우 cd myFold다음 pwd, 그것을 보여줍니다 당신이 myFold에있어. p4 소스 제어를 사용하는 상대 명령이 현재 디렉토리에 의존하기 때문에 이것은 나에게 거래 차단기입니다.
User5910

1
@ User5910 - 사용pwd -P
DVJ

2

그러나 dir에 대한 실제 별칭도 가능합니다.

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

이렇게하면 공통 이름 지정 규칙 (각 디렉토리 / 별칭 쌍에 대해)이 있고 현재 디렉토리에서 myScript로 무언가를 복사해야하는 경우에 대해 생각할 필요가 없습니다.

IHTH


1

내가 시도한 이전 답변은 별칭이 지정된 디렉터리의 하위 디렉터리를 자동으로 확장 (자동 완성) 할 수 없습니다.

그러나 별칭을 지정할 디렉토리를 dirs스택 에 푸시하면 ...

$ pushd ~/my/aliased/dir

... 그런 다음 입력 dirs -v하여 스택에서 숫자 위치를 볼 수 있습니다 .

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

디렉토리 매개 변수를 예상하는 모든 명령은 아니지만 대부분의 경우 해당 번호를 사용하여 참조하십시오.

 $ mv foo.txt ~0  

Tab"aliased"디렉토리의 바로 아래 하위 디렉토리를 표시하는 데 사용할 수도 있습니다 .

 $ cd ~0/<Tab>
 child_dir1    child_dir2

-1

myscript에 다음 줄을 넣으십시오.

set myFold = '~/Files/Scripts/Main'

터미널에서 사용

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