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 $PWDpwd. 디렉토리 이름이 외부에서 바뀐 것을 알 수 있습니다. 쉘 환경이 업데이트되지 않았습니다.
  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.