bash 별칭이 경로가 될 수 있나요?

bash 별칭이 경로가 될 수 있나요?

bash 별칭이 경로가 될 수 있나요?

안녕하세요. 멍청한 질문이라 미리 죄송합니다. Bash 별칭을 사용할 때 이상한 동작을 발견했습니다.

내 목표

해결책은 일반적으로 사용되는 경로에 대해 짧은 bash 별칭을 사용하여 셸에서 더 쉽게 탐색하는 것입니다. 예를 들어, uni내 데이터 드라이브에 탑재된 University () 폴더 로 빠르게 이동하기 위해 /mnt/databash 별칭을 사용했습니다 alias uni='/mnt/data/uni'. 이제 상위 디렉토리에 있고 를 /mnt/data실행 하면 cd uni상상한 대로 작동하고 /mnt/data/uni.

질문

그러나 다른 드라이브(예: 루트 디렉터리)에 있고 동일한 명령을 실행하면 오류가 발생합니다 bash: cd: uni: No such file or directory. 방금 실행하면 bash가 이것이 디렉토리임을 "인식"한다는 uni출력이 표시됩니다. bash: /mnt/data/uni: Is a directory그러나 어떤 이유로 상위 디렉터리에 없는 디렉터리로 이동하기 위해 별칭을 cd 함수와 함께 사용할 수 없습니다.

cd해당 명령을 별칭에 추가하여 로 읽으면 별칭 alias uni='cd /mnt/data/uni'이 모든 디렉터리에 대해 작동합니다. 하지만 별칭의 경로만 다른 기능을 사용할 수 있기를 바랍니다. 이제 이 디렉토리로 수행하는 작업의 99%가 탐색일 뿐이므로 별칭을 포함할 수 있습니다 cd. 그러나 가장 짜증나는 것은 이 경우 별칭이 작동하는 방식을 완전히 이해하지 못한다는 것입니다.

내 질문

누군가 내 별칭이 이렇게 작동하는 이유와 여기서 무엇을 놓치고 있는지 설명할 수 있습니까? 별칭 경로만 사용하는 솔루션도 편리합니다.

감사합니다! 건배

답변1

아니요, 별칭은 경로가 될 수 없습니다. 또는 더 정확하게 말하면 수행할 수 있는 작업으로 가는 경로일 뿐입니다. 별칭은 명령으로 실행되므로 alias uni=/bin/ls'이것이 명령에 대한 경로이기 때문에 작동합니다. 하지만 디렉터리이므로 실행할 수 없기 alias uni=/mnt/data/uni때문에 작동하지 않습니다 .uni

들어가서 작동하는 이유는 /mnt/data이라는 하위 디렉터리가 있기 때문입니다. uni따라서 cd uni해당 디렉터리로 이동하면 됩니다. 별칭은 여기서 호출되지도 않습니다. 이것은 전혀 관련이 없습니다. 쉘이 보는 것은 명령( cd)과 대상(디렉토리 uni)뿐이며 별칭 함수는 전혀 호출되지 않습니다.

이와 같이 디렉토리에 쉽게 접근할 수 있도록 하려면 해당 디렉토리를 변수로 설정하면 됩니다. 파일 에 다음을 추가하세요 ~/.bashrc.

uni="/mnt/data/uni"

파일을 저장하고 새 터미널을 열면 이제 어디에서나 cd "$uni"해당 터미널로 이동할 수 있습니다./mnt/data/uni

답변2

별칭은 경로가 될 수 없습니다. 그들은 단지 지휘자가 될 수 있습니다. cat uni/file.txt또는 를 실행하면 bash는 별칭으로 cd uni확장을 시도하지 않습니다 . uni이런 일이 일어나기를 원한다면 가장 가까운 일은 그것을 만드는 것입니다.바꾸다.

uni=/mnt/data/uni
cd $uni
cat $uni/file.txt

경로에 공백(또는 파일 이름에 거의 발생하지 않는 기타 특수 문자)이 포함된 경우변수를 사용할 때는 큰따옴표가 필요합니다.:

pol="/mnt/data/Pol Sci"
cat "$pol/file.txt"              # works
cat "$pol"/file.txt              # works
cat $pol/file.txt   # doesn't work: tries to print the content of /mnt/data/Pol and of Sci.txt

활성화하면cdable_vars$옵션을 사용하면 입력 및 큰따옴표를 저장할 수 있습니다 .

shopt -s cdable_vars
pol="/mnt/data/Pol Sci"
cd "$pol"                        # works
cd $pol                          # doesn't work ("cd: too many arguments")
cd pol                           # works thanks to cdable_vars

그러나 명령에 대한 바로가기에만 관심이 있는 경우 해당 명령을 별칭에 cd포함하면 됩니다 .cd

alias uni='cd /mnt/data/uni'
uni                              # equivalent to cd /mnt/data/uni
alias pol='cd "/mnt/data/Pol Sci"'
pol                              # equivalent to cd "/mnt/data/Pol Sci"

대안으로 또는 추가로 활성화할 수 있습니다.autocd옵션. 이로 인해 bash는 명령 위치의 디렉터리를 디렉터리를 변경하라는 명령으로 해석합니다.

shopt -s autocd
/some/where                 # equivalent to cd /some/where

이렇게 하더라도 별칭은 다른 작업을 수행할 수 없으므로 별칭 cd에 포함시키기만 하면 됩니다.uni

언급할만한 또 다른 관련 기능은CDPATH바꾸다. "빠른 디렉토리 변경" 위치를 정의할 수 있습니다. 예를 들어:

CDPATH=$HOME:/mnt/data
cd /some/where
cd uni

명령은 cd uni먼저 로 변경하려고 시도한 /some/where/uni다음, 존재하지 않으면 시도하고 $HOME/uni, 존재하지 않으면 시도합니다 /mnt/data/uni. 이 기능은 때로는 편리하기 때문에 마음에 들 수도 있고 마음에 들지 않을 수도 있지만, 한편으로는 실수로 원하지 않는 디렉토리로 변경하여 잘못된 프로젝트로 작업하게 되는 경우도 있습니다.

답변3

bash가 경로 별칭을 허용하지 않는다는 다른 답변자가 정확하지만 zsh로 전환하는 것을 고려할 수 있습니다.전역 별칭, 이는 경로일 수 있습니다.

alias -g uni=/mnt/data/uni
cd uni

zsh에서는 작동하지만 bash에서는 작동하지 않습니다.

관련 정보