![CDPATH의 cd 명령에 대한 "대체 디렉터리 이름"은 무엇입니까?](https://linux55.com/image/178161/CDPATH%EC%9D%98%20cd%20%EB%AA%85%EB%A0%B9%EC%97%90%20%EB%8C%80%ED%95%9C%20%22%EB%8C%80%EC%B2%B4%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%22%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
CD 및 Bash 도움말 페이지에서:
The variable CDPATH defines the search path for the directory containing
DIR. Alternative directory names in CDPATH are separated by a colon (:).
A null directory name is the same as the current directory. If DIR begins
with a slash (/), then CDPATH is not used.
:
하지만 "대체 디렉터리"라는 개념을 이해하지 못하고 명령에서 콜론( )을 사용하는 예를 찾을 수 없습니다 cd
.
답변1
이 변수는 기본적으로 설정되어 있지 않지만(적어도 내가 익숙한 시스템에서는)할 수 있는지정한 대상 디렉토리를 검색하기 위해 다른 디렉토리를 사용하도록 설정합니다 cd
. 예를 들어 이를 설명하는 것이 더 쉬울 수 있습니다.
$ echo $CDPATH ## CDPATH is not set
$ cd etc ## fails: there is no "etc" directory here
bash: cd: etc: No such file or directory
$ CDPATH="/" ##CDPATH is now set to /
$ cd etc ## This now moves us to /etc
/etc
즉, 기본 동작은 cd foo
"현재 디렉터리의 하위 디렉터리인 "foo"라는 디렉터리로 이동하는 것입니다.또는"디렉터리"는 CDPATH에 지정된 다른 디렉터리에 있습니다. CDPATH
설정하지 않으면 cd
현재 디렉터리에서만 검색되지만 설정되면 설정한 디렉터리에서도 일치하는 항목을 찾습니다.
콜론은 와 함께 사용되지 않으며 cd
, 에 설정할 디렉토리를 구분하는 데 사용됩니다 CDPATH
.
CDPATH="/path/to/dir1:/path/to/dir2:/path/to/dirN"
답변2
설명서에, CDPATH
다음과 같이 설명됩니다.
cd 명령의 검색 경로입니다. 이는 쉘이 cd 명령으로 지정된 대상 디렉토리를 찾는 콜론으로 구분된 디렉토리 목록입니다. 예제 값은 ".:~:/usr"입니다.
완전성을 위해 여기에는 다음과 비슷한 것이 있습니다. 특별한.
$~> mkdir /tmp/2 ./2 ./3
$~> cd 2
$~/2> cd ..
$~> CDPATH=/tmp
$~> cd 2
/tmp/2
$~> cd ~
$~> cd 3
$~/3>
보시다시피 일단 설정되면 CDPATH=/tmp
Bash는 /tmp
먼저 가능한 대상 디렉터리를 찾습니다. 에서 찾을 수 없으면 /tmp
현재 디렉터리에서 찾으려고 시도합니다. 우리는 또한 (쉘 내장 함수)
CDPATH의 비어 있지 않은 디렉토리 이름이 사용되거나 -가 첫 번째 인수이고 디렉토리 변경이 성공하면 새 작업 디렉토리의 절대 경로 이름이 표준 출력에 기록됩니다.
나는 또한 이것을 공유하고 싶다:
$~> CDPATH=.:/tmp
$~> cd 2
/home/myuser/2
$~/2> cd 2
/tmp/2
이 연속에서는 CDPATH
두 개의 디렉토리가 제공됩니다. 첫 번째는 .
현재 디렉터리입니다. 먼저 오기 때문에 노력한 후에 도착할 cd 2
것입니다 . 와 마찬가지로 먼저 나열된 디렉토리가 우선순위를 갖습니다./home/myuser/2
/tmp/2
$PATH
답변3
다른 답변은 CDPATH의 기본 사용법을 설명하지만 구체적인 사용 사례는 예시라고 생각합니다. 동일한 루트 디렉터리에서 시작하여 일련의 하위 디렉터리에서 작업을 반복적으로 수행하고 싶은 경우가 종종 있습니다.
cd ~/wrk
for d in */.git/hooks/; do
( cd "$d" && mv pre-commit pre-commit.off )
done
각 반복이 동일한 루트에서 시작되도록 하려면 서브쉘이 필요합니다. 아니면 그럴까요? 여기서 서브쉘 복제를 피할 수 있나요? 우리는 할 수 있습니다!
cd ~/wrk &&
CDPATH=$PWD
for d in */.git/hooks; do
cd "$d" && mv pre-commit pre-commit.off
done
이는 cd가 각 단계의 진행 상황을 알려준다는 추가 이점이 있습니다.
대체 디렉토리 이름은 어떻습니까? 특히 콰지모도의 사례가 좋은 것 같아요. .
CDPATH에 없으면 CDPATH가 우선 적용됩니다 . 그러나 이전 디렉터리가 우선적으로 적용되도록 하려면 CDPATH가 .
.