내가 심볼릭 링크에 대해 완전히 오해했거나(아마도) 어느 시점에서 동작이 바뀌었고 지금 따라잡고 있습니다.
/tmp/scripts
설명을 쉽게 하기 위해 파일 시스템에 스크립트 디렉터리가 있습니다 . 이 스크립트 디렉토리는 프로젝트 내에 심볼릭 링크를 생성하여 임의의 프로젝트에 추가하기 위한 것입니다. 즉, ln -s /tmp/scripts $(PROJECT)/scripts
이 디렉토리의 스크립트는 ../config
(즉, 프로젝트의 하위 디렉토리)에서 일부 프로젝트 관련 정보를 찾을 것으로 예상합니다. 그런데 제가 발견한 것은스크립트 디렉토리에서 스크립트가 실행되는 경우대신 상대 경로를 확인하여 /tmp/config
(존재하지 않음) 봅니다 .$(PROJECT)/config
진짜심볼릭 링크 컨텍스트를 무시한 스크립트 디렉터리의 위치입니다. 이는 cd $(PROJECT)/scripts; pwd
기호 링크 컨텍스트가 표시되는 경우에도 마찬가지 입니다.
다음은 Ubuntu 16.04에서 Bash 4.3.48을 사용하는 간단한 예입니다.
$ mkdir a
$ touch a/apples
$ mkdir -p b/a
$ touch b/a/bananas
$ mkdir -p b/c
$ ln -s b/c c
$ cd c
$ pwd
/home/user/c # note this does not show '/home/user/b/c'
$ ls ../a
bananas
$ cd ../a
$ ls
apples
이는 심볼릭 링크 뒤의 작업 디렉터리가 있는 프로세스가 이를 호출하는 프로세스와 동일한 환경을 갖고 있지 않다는 것을 암시하기 때문에 나를 놀라게 합니다.
어쩌면 항상 이런 식이었을까요? 스크립트 프로세스가 실제로 아직 $(PROJECT)/scripts
입력 되지 않았음을 아는 이유는 무엇입니까 pwd
? 가짜 인가요 pwd
? 누군가 이것을 설명할 수 있나요?
편집: 다음은 먼저 상대 디렉터리를 설정한 다음 스크립트(이 경우 간단한 Makefile)를 생성하고 호출하는 간단한 실제 예입니다.
#!/bin/bash
mkdir -p a
echo "A:=42" > a/Config
mkdir -p b/a
echo "A:=77" > b/a/Config
mkdir -p b/c
ln -sfn b/c c
echo -e "include ../a/Config\nall:\n\t@echo \${A}" > c/Makefile
cd c
make
이것은 출력될 것이고 77
, 나는 그것이 42
심볼릭 링크된 Makefile 등에서 사용하기 위해 프로젝트에서 설정한 값이 될 것이기 때문에 출력할 수 있기를 원합니다. 실제로 디렉터리는 b/a
실제로 존재하지 않으므로 다음과 같습니다.
#!/bin/bash
mkdir -p a
echo "A:=42" > a/Config
mkdir -p b/c
ln -sfn b/c c
echo -e "include ../a/Config\nall:\n\t@echo \${A}" > c/Makefile
cd c
make
다음으로 이어진다:
$ ./setup
Makefile:1: ../a/Config: No such file or directory
make: *** No rule to make target '../a/Config'. Stop.
답변1
cd
예상대로 작동하도록 하려면 다음으로 전화하세요.
cd -P c
다음을 인쇄합니다 pwd
.
/home/user/b/c
현재 보고 있는 문제는 쉘이 불만족스러운 POSIX 결정을 따르고 cd -L
기본값을 채택했기 때문에 발생합니다. 이렇게 하면 $PWD
/home/user/c
쉘 명령이 을 cd ..
호출하지 않고 chdir("..")
값 $PWD
을 한 요소만큼 단축한 다음 chdir()
단축된 경로로 이동하여 cd ..
원래 위치로 돌아오기 때문에 셸이 명백한 을 기억하게 됩니다 .
예를 들어 사람들이 달리는 경향이 있기 때문에 이는 보안 위험입니다.
ls ../
결과에 만족하면 다음을 실행할 수 있습니다.
cd ../; rm *.c
예상과 다른 파일을 삭제합니다.
POSIX 기본값은 기본 동작을 모델로 삼았 ksh88
으며 ksh가 해당 기본 동작을 도입했을 때 AT&T는 cd -P
Bourne Shell의 기본 동작으로 보다 안전한 변형을 구현하기로 결정했습니다.