cd합니다. 사용 했습니까?


102

내가 따랐던 튜토리얼 중 하나 cd .가 소용이 없다고 간단히 언급했다 . 기호 링크 재귀 에서 OP로 표시되는 문제를 복제하려고 할 때 무엇이 "재설정"됩니까? , 나는 또한 cd .OP와 같은 효과 (증가 $PWD변수) 를 보여주었습니다 cd -P.

이것은 실제로 궁금해합니다. 실제로 사용하고 싶은 경우가 cd . 있습니까?


20
디렉토리를 전환 할 때 디렉토리에서 다양한 검사를 실행하는 사용자 지정 .zshrc가 있습니다. 예를 들어 검사 중 하나는 디렉토리를 이동할 때 일치하는 virtualenv를 자동으로 활성화 / 비활성화하는 것입니다. 때때로, 나는 새로운 쉘이나 다른 것을 시작할 수 있으며, 그 검사는 실행되지 않으며, 일반적으로 cd .검사가 짧고 간단하기 때문에 검사를 시작 하는 데 사용 합니다. 나는 당신이 바닐라 환경에 대한 질문을 의도했다고 생각하지만.
— 거짓말 라이언

29
에 (명백한) 효과 외에 $PWD, cd .또한 변경 $OLDPWD현재 디렉토리. 나는 이것이 현재 왜 유용한 지 모르겠지만, 완전성을 위해…
— Andreas Wiese

5
나는 내가 필요하다고 생각하지는 않지만 cd ., 아래 답변을 보았지만 앞으로는 그럴 수도 있지만 나중에이 디렉토리 pushd .로 popd돌아갈 수 있기를 원했던 적이 있습니다 . 예를 들어 configure, cd output...및 을 수행하는 빌드 스크립트를 실행할 때 make및 완료되면 원래 디렉토리로 돌아가고 싶습니다. 다른 사람들이 기대하는 것과는 다른 빌드 스크립트 사본을 유지 관리하는 대신 그냥으로 실행하면 가끔 pushd .; ./BuildScriptName.sh; popd그렇지 않을 popd수도 popd있습니다.
— 3D1T0R

5
물론 '.'는 말할 것도 없습니다. 그리고 '..'는 cd 명령 자체에서 구현되지 않으므로 아무도 특정 기능을 만들기 위해 설정하지 않았습니다. 실제 목적이 아닌 것들의 조합 일뿐입니다.
— David S

1
@ruakh 아니, 외부 프로그램은 쉘 실행 환경에 영향을 미치지 않아야합니다. 대부분 POSIX 준수를 위해 셸 외부에 일부 유틸리티가 있어야하며 외부 명령의 종료 상태를 평가해야합니다. unix.stackexchange.com/q/50058/85039/bin/cd
— Sergiy Kolodyazhnyy

답변:


158

나는 이것이 문제를 지나치게 생각하고 있다고 생각합니다. cd .일반적인 과정에서 수동으로 실행할 수는 없지만 프로그래밍 방식으로 실행될 수 있습니다 ( cd사용자가 경로를 제공하는 파일을 포함하는 디렉토리 에 어떤 상황이 있는지 생각 하십시오) ). 따라서 특정 용도를 사용할 필요는 없습니다. 일반적인 의미를 충족하는 한 cd <some-path>유용합니다.


12
동의 .하며 cd구문으로 지정된 유효한 경로로 처리해야 합니다.
— Sergiy Kolodyazhnyy

18
다음 예제를 추가 할 수 있습니다 IFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d). while like 루프 . 과정에서 find는 .경로로 생성 하여 명령이로 cd "$Dir"확장됩니다 cd .. 따라서 스크립트에서는 매우 유용합니다.
— rexkogitans

5
예를 들어, 스크립트는 실제로 실행 cd ${path_to_directory}되지만 어느 시점에서 디렉토리는 현재 디렉토리 path_to_directory = .이므로 , cd .경우에 따라 작업 해야 합니다.
— Demis

4
다시 말해, 그 유틸리티는 추가 코드 ( if검사 및 else절, 모든 종류의 특수 케이스)를 불필요하게 만든다는 사실에 있습니다 .
— jpmc26

2
따라서 x + 0 또는 x * 1이 유용하다는 의미에서 유용합니다. 특정 연산 자체는 유용하지 않지만 0과 1을 다른 값과 동일하게 취급 할 수 있습니다. 특별한 경우.
— user32929

127

마지막 명령이 실행 된 이후 디렉토리의 경로가 변경되었을 수 있으며 cd ., bash 및 ksh93 쉘이 없으면 질문에 링크 된 게시물에 설명 된 논리 작업 디렉토리에 의존하므로 syscall을 호출하면 cd .쉘 문제가 발생 getcwd()합니다. 현재 경로는 여전히 유효합니다.

bash에서 재현하는 단계 :

  1. 터미널 탭 문제 mkdir ./dir_no_1; cd ./dir_no_1
  2. 다른 터미널 탭 문제 mv dir_no_1 dir_no_2
  3. 첫 번째 터미널 탭에서 echo $PWD및 pwd. 디렉토리 이름이 외부에서 바뀐 것을 알 수 있습니다. 쉘 환경이 업데이트되지 않았습니다.
  4. 문제 cd .; pwd; echo $PWD. 값이 업데이트되었습니다.

그러나 ksh93은 환경 정보를 업데이트하지 않으므로 cd .ksh93에서는 실제로 쓸모가 없습니다. 에서 /bin/dash우분투와 다른 데비안 기반 시스템에서, cd .반환 dash: 3: cd: can't cd to .그러나 오류 cd -P .(ksh93과 달리) 작동합니다.


22
알아두면 좋은 점 : 쓸모없는 정보 목록에 추가하겠습니다. ^^)
— jayooin

12
@jayooin 다행 나는 목록에 기여할 수 있었다;)
— Sergiy Kolodyazhnyy

8
나는 당신 mv ../dir_no_1 ../dir_no_2이 같은 터미널 / bash 에서 할 수 있다고 생각합니다 .
— ctrl-alt-delor

3
@ ctrl-alt-delor 확인, 작동 :)
— Sergiy Kolodyazhnyy

1
@ymbirtt 대부분의 쉘 pwd에서 실제로는 내장되어 있지만 호출 /bin/pwd은 쉘 환경에 영향을 미치지 않습니다. 일반적으로 외부 유틸리티는 쉘 환경에 영향을 미치지 않습니다. 그 이유 /bin/cd와 /bin/pwd존재 이유 는 POSIX 준수 때문입니다. 있어 외부 CD에 대한 좋은 논의 아마 적용 일부 /bin/pwd뿐만 아니라이
— 세르지 Kolodyazhnyy

55

또 다른 유스 케이스는 cd .현재있는 디렉토리가 삭제 된 다음 다시 만들어진 경우입니다. 다음을 시도해보십시오-

  1. 디렉토리 만들기 temp
  2. cd temp 그런 다음 ls
  3. 다른 터미널을 열고 해당 디렉토리를 삭제 한 후 다시 작성하십시오. temp
  4. 첫 번째 터미널에서 ls를 시도하십시오. 오류가 발생합니다-ls: cannot open directory .: Stale file handle
  5. cd . 그리고 잘 작동합니다.

3
항상 작동하지는 않습니다. 예를 들어, 대시 : 예를 들어 cd: can't cd to .보았습니다. 이것은 Sergiy의 답변에서 이미 언급되었습니다 (이동, 삭제 / 다시 작성-본질적으로 동일합니다 : 현재있는 디렉토리가 더 이상 원본에 없었습니다) 경로)
— Olorin

12
나는 이것을 원격 테스트를 많이 테스트합니다. 내가있는 디렉토리는 삭제되고 일부 자동화에 의해 다시 작성되며 cd .동일한 이름의 새 디렉토리로 이동하려면 발행해야합니다 .
— HP Williams

2
cd .현재 작업 디렉토리가 sshfs로 마운트되었지만 ssh 세션이 닫히고 다시 열린 쉘이있을 때 항상 사용 합니다.
— jamesdlin

4
이 경우 "cd $ PWD"를 수행합니다. 다른 변형이 효과가 있지만 이것은 의도를 명확하게 표현합니다. 현재 경로로 추정되는 것을 추출한 다음 (예 : PWD환경 변수의 내용 읽기 ) 루트에서 파일 시스템 계층 구조를 루트에서 연결 가능한 디렉토리까지 걸어갑니다. 실제로 동일한 디렉토리인지 여부에 관계없이 해당 경로. 이것은이 답변의 유스 케이스와 정확히 일치합니다.
— Stéphane Gourichon

3
cd .디렉토리가 연결 해제되고 동일한 파일 시스템 경로에 새롭고 다른 디렉토리가 만들어 질 때 작동 한다는 사실에 놀랐 습니다. 현재 작업 디렉토리는 연결되지 않았으며 아마도 그 일부로 더 이상 .또는 ..항목 이 없으며 항목이 없어도 .항목 자체를 계속 가리켜 야합니다. 쉘 또는 커널이 단순히 .항목에 액세스하는 것이 아니라 디렉토리 경로 이름에 따라 cd 명령을 실행하는 것처럼 보입니다 . 누구든지 그 행동을 확인할 수 있습니까?
— Adrian Pronk

36

"관심이있는"곳을 가리키고 싶지 않은 경우가 있으면 $OLDPWDquick로 정리할 수 있습니다 cd .. 또한 영향을 미칩니다 cd -.


16

프로그래밍 방식으로 no-op로 유용합니다. 외부 입력에서 제공된 경로를 고려하십시오.

read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"

경로와 같은 "fred.txt"로 디렉토리가 될 것 .으로 이어지는,cd .


1
이미 탐색중인 디렉토리에있는 경우 오류가 발생하지 않는 것이 유용하지만 no-op로 유용하다고 말하지는 않습니다.
— 캡틴 맨

2
이미 디렉토리에 있으면 @CaptainMan이 오류를 발생시키지 않습니다 (효과적으로). 이 dirname명령 .은 경로를 분할 할 수있는 코드를 깨뜨리지 않도록 필요한 경우 생성 합니다.
— roaima

15

잘못된 USB 케이블로 작업해야하는 경우에 일반적입니다. 장치의 연결이 끊어졌다가 다시 연결되고 동일한 디렉토리에 자동 마운트 된 cd .후 다시 작동 하려면 사용해야 합니다.


1
그것은 어떤 종류의 장치, 어떻게 접근되는지, 파일 시스템, OS, & c에 의존하지 않습니까?
— gidds

OS 일 수도 있습니다. 커널이 사용되는 동안 마운트 해제하는 방법을 찾을 수 있다면 파일 시스템이 관련이 없을 것입니다. 어쨌든 명령은 정확한 상황에서 사용됩니다.
— user23013

11

"." 이다 (물론 쉘 프로세스 포함) 및 모든 프로세스의 현재 작업 디렉토리로 열려있는 파일의 이름을 지정하는 적절한 방법은 "." 현재 작업 디렉토리를 포함하여 모든 디렉토리에있는 파일의 유효한 이름입니다. .기본 현재 작업 디렉토리가 제거 된 경우 (또는 오래된 NFS 핸들과 같이 "나쁜"상태가 된 경우) 올바른 이름 인 경우 프로세스의 지정된 인스턴스에 대해 파일 이름이 올바른 이름 이 아닐 수 있습니다. 유효한 모든 디렉토리에 존재하도록 보장 된 파일의

따라서 디렉토리 이름을 허용하는 모든 명령에 대해 유효한 인수 . 여야 하므로 표준 쉘 cd .에서 유효한 명령이어야합니다.

cd .유용한 지 여부 는 셸 구현에 따라 다릅니다. 언급했듯이 기본 chdir시스템 호출 을 호출 한 후 쉘이 현재 작업 디렉토리의 전체 경로 이름에 대한 내부 아이디어를 재설정하는 경우에 유용 할 수 있습니다 ( 예 : 기본 디렉토리 (또는 일부 상위 디렉토리)의 이름이 변경된 경우).

내가 아는 적어도 일부 쉘 ( /bin/shFreeBSD 및 NetBSD)은로 변환 cd ""될 것이다 cd .. 이것은 변수가 매개 변수로 사용될 수있는 쉘 스크립트에서 프로그래밍 방식의 사용을 지원하는 기능으로 설명 될 수있다 (즉, 빈 변수 대체를 " FreeBSD 커밋 히스토리는 POSIX 지원을 추가하여 실패를 막기 위해 POSIX 지원을 추가했기 때문에 변경 사항이 발생하지 않았지만 chdir("")POSIX 명령이 실패해야 한다고 말합니다 .

일부 다른 쉘은 .현재 작업 디렉토리에 대한 완전한 경로 이름으로 저장 한 것으로 대체 할 것이므로 Sahil Agarwal의 답변 에서 언급 된 동작을 허용 할 수 있습니다 .


4

나는 바로 같은 지점에서 처음 생성 된 디렉토리에서 Git에서 작업하고있는 지점을 리베이스 할 때 오늘이 명령을 사용했습니다. 리베이스는 잘되었지만 나중에 git status오류가 발생했습니다. cd .모든 것이 정상이 된 후 .

(저는 Windows의 MobaXterm에서 우연히 작업했습니다.이를 재현하려는 경우를 대비하여 다른 시스템에서는 발생하지 않을 수 있습니다.)


또한 이전 디렉토리를 제쳐두고 새 디렉토리로 바꾸는 자동화 된 프로세스로 새로 고친 디렉토리에서이 명령을 사용했습니다 (가능한 한 원자에 가깝습니다). 일반적인 상황은 아니지만 cd .정확히 필요한 것입니다.


Stephane Chazelas 에서이 훌륭한 답변을 읽은 후 :

나는 이제 작업 위 내 사용 사례가 내가 사용하고 있기 때문에 이해 bash하는, cd .동일합니다 cd "$PWD". 링크 된 답변을 읽는 것이 좋습니다.


1

함수 를 통해 cd .오버로드 된 내용을 다시 실행하는 데 사용 합니다. cdbash

내에서 ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}

0

편집 : 이것은 이미 Sahil 에 의해 이미 제안되었습니다 .

다른 프로세스에서 삭제하고 다시 만든 폴더 안에있는 경우 유용합니다. 예를 들어, 두 개의 터미널 세션을 가정하면 다음 $1과 $2같습니다.

$1 mkdir d
$1 cd d
$1 touch f

$2 rm -rf /path/to/d # delete the folder where $1 is in ...
$2 mkdir /path/to/d # ... and recreate it

$1 touch g # cannot create file g because current dir doesn't exist anymore
touch: cannot touch ‘g’: Stale file handle
$1 cd . # go to the newly created dir (same path)
$1 touch g # works fine now

이 동작의 근본 원인이 정확히 어디에 있는지 (OS, SHELL, ...?) 확실하지 않습니다.


이것은 이미 다른 답변에서 언급되었습니다.
— Kusalananda

-8

아니, 말이되지 않습니다. 스크립팅에서도 아무것도하지 않습니다.


2
쉘에 따라 재설정 $PWD되고 사용자가 cd내장 기능을 오버로드하기 위해 자체 함수 또는 별명을 제공 한 경우 다른 쉘 함수를 호출 할 수 있습니다 cd. 또한 현재 디렉토리가 여전히 유효하고 현재 사용에 대한 권한이 있는지 확인합니다.
— Kusalananda

1) 물론 "cd"의 가능한 사용자 지정 별칭에 대해 이야기하지 않고 표준 빌드 2) 권한이없는 경우 현재 사용이 어떻게 될 수 있습니까? 간단하게하기 위해 나는 단지 실제 세계에서는 그것을 내 의견으로는 사용할 이유가 없다고 말합니다.
— Federico

1
1) 우리는 아닌가요? 2) 실제 세계는 단순하지 않으며 Unix는 다중 사용자 운영 체제입니다. 사용자는 디렉토리에 대한 권한을 변경할 수 있으며 스크립트 또는 다른 사용자의 대화식 쉘이 해당 디렉토리 (또는 그 서브 디렉토리)를 작업 디렉토리로 가지고 있으면 cd .불만을 표시합니다.
— Kusalananda

4
Federico는 사이트의 규칙과 본인의 개인적 규칙에 따라 귀하의 답변을 아래로 내리겠습니다. 그러나 당신은 새로운 사람입니다. 어서 오십시오! 다른 답변 중 일부를 검토하십시오 . 그 후에 답변이 잘못되었다고 생각되면 삭제하십시오. 이 질문에 대한 다른 답변과 다른 답변을 즐기십시오.
— daveloyall

2
특히 스크립팅에서 때때로 "아무것도하지 않습니다"는 정확히 필요한 것입니다.
— Matthew Najmon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.