cp SOMEFILE .. 심볼릭 링크를 통해 다른 디렉터리로 복사 cd

cp SOMEFILE .. 심볼릭 링크를 통해 다른 디렉터리로 복사 cd

다음 설정을 고려하십시오.

~/Desktop/Public/subdir
~/Desktop/subdir --> ~/Desktop/Public/subdir (symbolic link)

이제 나는 이것을 한다:

cd ~/Desktop/subdir

그러면 링크된 디렉토리로 연결됩니다.

지금 명령을 실행하면:

cd ..

나는 다시 Desktop디렉토리로 이동될 것이다. 이는 cd 명령이 상황에 맞는 명령임을 의미합니다. 즉, subdir기호 링크를 통해 입력한 것을 기억합니다.

그러나 명령을 실행하면

cp testfile ..

testfile에 복사됩니다 Desktop/Public.

나는 cd의 (보통 예측할 수 없는) 동작을 선호합니다 cp. 어쨌든, 이러한 행동 차이의 이유가 무엇인지 알고 싶습니다. 단지 레거시 문제입니까, 아니면 합당한 이유가 있습니까?

답변1

cda를 통해 디렉토리에 들어갔다는 것을 아는 이유 symlink는 디렉토리가 쉘에 내장되어 있기 때문입니다. 이 cp명령은 외부 바이너리이며 명령줄 인수와 환경 변수를 통해서만 데이터를 전달합니다. 환경 변수에 다음 데이터가 포함되어 있지 않습니다.어떻게현재 디렉터리를 입력했습니다.

을 사용하면 일관성을 유지하려는 것처럼 기능을 동일하게 bash만들 수 있습니다 . 이것을 달성할 것이다. 맨페이지에서:cdcpset -P

          -P      If  set,  the shell does not follow symbolic links when executing commands such as cd that change the current working directory.  It uses the physical directory structure instead.  By default, bash follows the
                  logical chain of directories when performing commands which change the current directory.

답변2

cd설명된 대로 작업할 때만 cd쉘에 대한 트릭이 될 수 있습니다. ..상위 디렉토리의 항목입니다. 귀하의 경우 의 부모는 subdir될 수도 Public있고 될 수도 없습니다 Desktop. 따라서 cp올바르게 생각하면 리디렉션(예 >: )에서도 동일한 동작을 얻게 됩니다.

CD 예제에서는 "사용자 친화적인" 트릭을 사용하여 실제처럼 작동합니다. 바라보다https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links

해당 기능이 정말로 필요한 경우 다음과 같은 것을 사용해야 합니다.

cp testfile "${PWD##*/}"

(쉘 추적에 따라 현재 디렉토리의 상위 디렉토리에 복사됨) zsh에서는 이것을 다음과 같이 단순화할 수 있습니다.cp testfile $PWD:h

답변3

그와는 정반대입니다. 다른 응용 프로그램처럼 동작하며 현재 디렉터리의 상위 디렉터리로 cp해석됩니다 . ..이는 커널이 이를 ..현재 디렉터리의 상위 디렉터리로 해석하기 때문입니다.

심볼릭 링크를 실행할 때 cd전달하는 경로는 cd대상 디렉터리의 상위 디렉터리를 명백하게 나타내지 않습니다. 을 실행하면 cd ~/Desktop/subdir대상은 /home/konstantin/Desktop/subdir심볼릭 링크가 아닙니다. 대상 디렉터리는 입니다 /home/konstantin/Desktop/Public/subdir. (또는 현명하게 말하면 대상 디렉터리는 루트 디렉터리 subdir의 하위 디렉터리인 Public의 하위 디렉터리입니다.) 아님: 하위 디렉터리가 없는 경우에만 상위 디렉터리에 있는 속성입니다. .home/home/konstantin/Desktop/subdir/../home/konstantin/Desktop/…stuff…/subdir/…stuff…

디렉토리에 대한 기호 링크를 디렉토리로 처리하는 것이 편리한 경우가 많기 때문에 쉘은 기호 링크 추적을 수행합니다. 를 실행하면 cd쉘은 목적지에 도달하는 데 사용한 경로를 기억합니다(아마도 심볼릭 링크를 사용하여). ..인수 cd(또는 유사한 쉘 내장 함수(예: ))에서 이를 사용 하면 pushd쉘은 텍스트를 현재 디렉토리로 해석하는 대신 텍스트 해석을 수행 ..합니다 . 이렇게 하면 심볼릭 링크가 실제로 디렉터리인 것처럼 동작합니다.cd /some/stuff/../morecd /some/morecd

텍스트 해석을 ..논리적 디렉터리 추적이라고 하며, 파일 시스템 해석을 ..물리적 디렉터리 추적이라고 합니다. 물리적 디렉터리 추적을 사용하려면(예: 텍스트 해석이 꺼짐 ..) 이 -P옵션을 에 전달합니다 cd. 이 -L옵션은 비활성화된 경우 논리 추적을 강제로 활성화합니다. 논리 추적은 기본적으로 꺼져 있습니다. set -Pbash 또는 zsh를 사용하여 setopt chase_links끌 수 있습니다.

이 명령은 pwd쉘이 추적하는 현재 디렉토리를 표시합니다. 와 마찬가지로 또는 옵션을 통해 논리적 또는 물리적 추적을 강제 cd할 수 있습니다 .-L-P

이 모든 일은 쉘 내부에서 발생합니다. 이와 같은 외부 애플리케이션은 cp추적 셸 내부에서 수행되는 작업을 알 수 없습니다. 따라서 명령의 매개변수에서 논리적 디렉터리 추적을 사용하려면 먼저 논리적 추적에 의존하지 않는 경로로 변환해야 합니다.

쉘 변수는 PWD현재 디렉토리를 추적합니다( $PWD인쇄된 것과 동일한 문자열을 포함함 pwd). /..논리적 추적에만 적용되는 항목을 추가하는 대신 현재 디렉터리에 대한 추적 경로의 마지막 텍스트 구성 요소를 제거하려는 경우 텍스트 메서드를 사용할 수 있습니다.

cp testfile "${PWD##*/}"

또는 zsh에서:

cp testfile $PWD:h

입력하고 싶고 ..디렉토리를 다르게 표현하는 것에 대해 생각할 필요가 없다면 cd원하는 대상 디렉토리로 실행한 다음 명령 인수에 대상 경로를 사용하십시오.

cp testfile "$(cd .. && pwd)"

관련 정보