bash와 자동 완성 기능이 .. 디렉토리 심볼릭 링크의 의미에 대해 충돌합니다.

bash와 자동 완성 기능이 .. 디렉토리 심볼릭 링크의 의미에 대해 충돌합니다.

내 홈 디렉터리에서 /home/regis해당 디렉터리에 대한 심볼릭 링크를 생성하고 작업을 실행한 후 bash와 해당 자동 완성기 간에 충돌이 발생하여 충돌이 발생했습니다.LINKDIR/SUBDIRcd LINK..

bash 자동 완성기의 경우 PS1을 사용할 때 나타나는 프롬프트와 마찬가지로 비밀번호가 표시되므로 사용자가 예상하는 대로 ..이 결과가 발생합니다 ./home/regis/home/regis/LINK\w

Bash 자체의 경우 ..cause DIR../..cause 는 표시된 대로 /home/regis실제 경로를 사용하고 있음을 의미합니다 ./home/regis/DIR/SUBDIRpwd -P

여기서는 어떤 종류의 동작이 예상되어야 합니까? 내가 여기서 뭔가 잘못하고 있는 걸까요?

/home/regis$ 터치 파일
/home/regis$ mkdir -p DIR/SUBDIR
/home/regis$ ln -s 디렉토리/하위 ​​디렉토리 링크
/home/regis$ CD 링크

/home/regis/LINK$ ls ../FI # 여기서는 TAB을 사용한 자동 완성이 성공합니다.
/home/regis/LINK$ ls ../FILE # 하지만 여기서는 자동 완성 명령이 실패합니다.
ls: '../FILE'에 접근할 수 없습니다: 해당 파일이나 디렉터리가 없습니다
/home/regis/LINK$ ls ../../FILE # 명령 성공
문서

$ bash -버전
GNU bash, 버전 5.0.17(1)-릴리스(x86_64-pc-linux-gnu)

답변1

Bash 자체의 ..원인 DIR../..원인 /home/regis,

보통은 아니지...

/home/regis/LINK$ ls ../FILE # but autocompleted command will fail here
ls: cannot access '../FILE': No such file or directory
/home/regis/LINK$ ls ../../FILE # command succeeds

...하지만 이것은 Bash가 아닙니다. 이것은 ls.

문제는 사용자 친화적이려고 노력하는 Bash가 cd심볼릭 링크를 통과할 때 해당 위치에 도달하기 위해 택한 경로를 내부적으로 기억한다는 것입니다. 그런 다음 cd ..예를 들어 Bash에서 해당 경로를 사용하면 cd LINK; cd ..시작한 곳으로 돌아갈 수 있습니다.

그러나 이는 ls외부 프로세스이므로 이에 대해 아무것도 모르고 어떤 명령을 사용하여 거기에 도달하든 /home/regis/DIR/SUBDIR바로 여기에 있는 일부 작업 디렉터리에서만 실행되고 있는 것으로 보입니다. cd글쎄, 실제로는 경로 이름을 운영 체제에 전달하고 운영 체제는 신경 쓰지 않고 파일 시스템의 항목 ls과 함께 작업 디렉터리를 있는 그대로 사용합니다 ...

대신 사용 하면 쉘은 이 특별한 동작을 비활성화하고 쉘에서와 동일한 경로를 cd -P LINK볼 수 있습니다 . /home/regis/DIR/SUBDIR일반적으로 사람들은 심볼릭 링크가 가리키는 지점을 지나서 "위로" 이동하려고 시도하지 않는 한 대부분의 경우 잘 작동하기 때문에 신경 쓰지 않습니다.

내 이전 답변도 참조하세요. https://unix.stackexchange.com/a/739426/170373동일한 주제에 대한 "예쁜" ASCII 차트의 경우.

관련 정보