심볼릭 링크 대상에서 ~를 사용하거나 변수를 사용하여 심볼릭 링크를 만듭니다.

심볼릭 링크 대상에서 ~를 사용하거나 변수를 사용하여 심볼릭 링크를 만듭니다.

심볼릭 링크를 만들고 싶지만 ~/foo/작성하면 ~항상 절대 홈 경로로 확인됩니다. 나는 ../과거에 s를 사용했는데 잘 작동했습니다. ~허용되지 않습니까?

내가 이렇게 하고 싶은 이유는 ~컴퓨터와 Linux/OSX에 따라 절대 경로가 다르지만 항상 내 홈 디렉터리를 가리키기 때문입니다.

여러 컴퓨터에서 동기화된 git 저장소의 링크를 갖고 싶습니다.

답변1

물결표 문자는 셸에 의해 확장됩니다.앞으로명령이 실행됩니다. 의 값으로 대체됩니다 $HOME. 따라서 ln기호 링크를 생성하는 유틸리티는 물결표를 볼 수 없으며 전체 경로만 볼 수 있습니다. 경로는 심볼릭 링크에 저장됩니다.


존재하다리눅스, 심볼릭 링크 변수를 생성할 방법이 없습니다. 커널에 의해 처리됩니다. 커널은 환경 변수를 지원하지 않습니다.


BSD이러한 링크는 허용됩니다. 그들이 전화한다변형 심볼릭 링크. 다음을 수행할 수 있습니다.

$ ln -s ’${variable}’ linkname
$ ls -l linkname
lrwxrwxrwx 1 root root 6 Sep 29 12:33 linkname -> ’${variable}’

그리고varsym그런 다음 다음 변수를 설정할 수 있습니다.

varsym variable=value cat linkname
[...] contents of file with name value [...]

답변2

심볼릭 링크 관련 문제를 해결하려면 "허용되지 않습니까?"

답변: ~는 허용되지 않습니다. 이러한 심볼릭 링크를 생성할 수 있지만 실행 시 홈 디렉터리로 확인되지는 않습니다.

ln -s \~ d
ls -ld d
lrwxrwxrwx 1 steve steve 1 Sep 29 11:28 d -> ~
ls d
d
cd d
cd: d: No such file or directory

답변3

환경에 대한 제어 수준에 따라 원하는 것과 유사하게 작동하는 네임스페이스를 구성할 수 있습니다. 이를 수행하는 스크립트는 다음과 같습니다.

#!/bin/bash

if [ "$(id -u)" -ne "0" ]; then
    FAKEROOT=$(mktemp -d --tmpdir "fakeroot.XXXXXXXXXX")
    unshare -Urm "$0" "${FAKEROOT}"
    rm -rf "${FAKEROOT}"
    exit 0
fi

FAKEROOT="$1"
mkdir -p "${FAKEROOT}/old_root"
for FILE in $(ls /); do ln -s "/${FILE}" "${FAKEROOT}/old_root/${FILE}"; done
for FILE in $(ls /); do ln -s "old_root/${FILE}" "${FAKEROOT}/${FILE}"; done
mount --bind "${FAKEROOT}" "${FAKEROOT}"
pivot_root "${FAKEROOT}" "${FAKEROOT}/old_root"
/bin/bash --init-file <(echo '. ~/.bashrc; symvar() { VAR=$(echo "$1" | sed "s/=.*//"); TGT=$(echo "$1" | sed "s/[^=]*=//"); ln -sf "${TGT}" "/\${${VAR}}"; }')

이 시점에서 BSD 구문을 사용하여 심볼릭 링크 변수를 정의할 수 있습니다.

symvar HOME=/home/your-username

다음과 같이 심볼릭 링크를 만들 수 있습니다.

ln -s '/${HOME}/Desktop' 'Desktop Folder'

이 솔루션을 "다시 덮다" 솔루션 코드*를 사용하면 기본 스크립트에 다음과 같은 내용을 포함할 수 있습니다.

symvar HOME="${HOME}"

예(스크립트의 마지막 줄 바꾸기):

revertuid /bin/bash --init-file <(echo '. ~/.bashrc; symvar() { VAR=$(echo "$1" | sed "s/=.*//"); TGT=$(echo "$1" | sed "s/[^=]*=//"); ln -sf "${TGT}" "/\${${VAR}}"; }; symvar HOME="${HOME}";')
  • 참고: 사용자 ID가 1000이 아닌 경우 revertuid 샘플 코드를 조정해야 합니다. 당신이 해야 할 일은 UID를 첨자에 전달하고 이를 revertuid의 첫 번째 인수로 전달하는 것뿐입니다.

답변4

프로젝트 루트의 심볼릭 링크를 참조하는 상대 심볼릭 링크를 프로젝트에 배치하여 이 문제를 해결했습니다. 프로젝트 루트 디렉터리에서 symlinkToHomeDir.README다음 명령을 실행하는 파일을 만들었습니다.

ln -s ~ ./symlinkToHomeDir

프로젝트 초기화 스크립트의 일부로 이 심볼릭 링크를 생성할 수 있습니다.

루트 수준 심볼릭 링크는 내 .gitignore파일에 있으므로 다른 사용자의 디렉터리에 복사되지 않습니다.

관련 정보