envs의 모든 경로를 다른 경로로 바꾸는 방법은 무엇입니까?

envs의 모든 경로를 다른 경로로 바꾸는 방법은 무엇입니까?

나는 다음과 같은 상황에 처해 있습니다.

내 모든 소프트웨어는 해당 /home/daniel/*경로에 설치되어 내부적으로 참조됩니다. 그러나 네트워크 드라이브를 사용하면 참조가 로 변경되어 /home/foo/daniel더 이상 소프트웨어를 사용할 수 없습니다.

예를 들어 일부 프로그램을 호출하거나 일부 환경 변수를 변경하여 go 경로를 변경하는 방법이 있습니까? 아니면 두 개의 프로그램이 있어야 합니까?

답변1

소프트웨어가 어떻게 작동하는지에 따라 다릅니다.추천내부 경로로.

환경 변수를 통해서만 수행할 수 있는 경우 다음을 수행할 수 있습니다.

eval "$(export -p | sed 's|/home/daniel|/home/foo/daniel|g')"

모든 /home/daniels를 /home/foo/daniel해당 값으로 변경하십시오.

추가 /home/foo/daniel/lib(또는 공유 라이브러리가 설치된 위치)는 $LD_LIBRARY_PATH프로그램에서 해당 라이브러리를 찾는 데 도움이 됩니다. 그러나 일부 소프트웨어가 conf 파일을 찾 /home/daniel/etc거나 에서 특정 데이터 파일을 찾도록 하드 코딩된 경우 /home/daniel/share이를 재정의하도록 설정할 수 있는 동등한 표준 환경 변수가 없습니다.

문제를 해결하기 위해 /home/daniel-> 심볼릭 링크를 추가하거나 chroot 또는 사용자 설치 네임스페이스를 생성할 수 없는 경우 예를 들어 소프트웨어를 다시 컴파일하는 것이 좋습니다 . 그러면 원하는 위치에 언제든지 심볼릭 링크를 사용할 수 있습니다.../foo/daniel--prefix=/var/tmp/daniel

답변2

나는 당신이 쉘 스크립트에 대해 이야기하고 있다고 가정합니다. 스크립트 이름을 사용할 수 있다는 사실을 활용해 보세요  $0. 불행하게도 이것은 ./myprog도움이 되지 않는 것처럼 보일 수 있으므로 realpath전체 경로 이름을 얻으려면 (또는 이에 상응하는)를 사용하십시오.

귀하의 질문에서 알 수 있듯이 이것은 항상 작동해야 합니다. 하지만 충분하지 않은 경우 $PWD대체용으로 사용해 보세요. 다음 코드는 작업을 "해야" 합니다.

getdir()
{
    case "$1" in
      (*/daniel/*)
            my_dir=$(printf '%s\n' "$1" | sed 's|/daniel/.*|/daniel|'
            return 0
      (*)
            return 1
    esac
}

getdir $(realpath "$0")  ||  getdir "$PWD"  ||  { echo "I dunno."; exit 1; }

따라서 스크립트가 현재 다음과 같이 말한다면

date >> /home/daniel/log

당신은 그것을로 바꿀 것입니다

date >> "$my_dir"/log

방금 우연히 발견했어요스크립트 자체에서 Bash 스크립트의 소스 디렉터리를 어떻게 얻나요?, 72개의 답변이 있으며 그 중 일부는 위 답변의 변형입니다.

관련 정보