2011-08-23 6 views
0

는 bash 쉘에서 나는 스크립트 소스, 링크에 의해 호출 된 경우에도 스크립트의 전체 경로를 얻을 수 있습니다/... 등 이 마법의 bash 라인 :.tcsh의 스크립트의 전체 경로

#Next lines just find the path of the file. 
#Works for all scenarios including: 
#when called via multiple soft links. 
#when script called by command "source" aka . (dot) operator. 
#when arg $0 is modified from caller. 
#"./script" "/full/path/to/script" "/some/path/../../another/path/script" "./some/folder/script" 
#SCRIPT_PATH is given in full path, no matter how it is called. 
#Just make sure you locate this at start of the script. 
SCRIPT_PATH="${BASH_SOURCE[0]}"; 
if [ -h "${SCRIPT_PATH}" ]; then 
    while [ -h "${SCRIPT_PATH}" ]; do SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done 
fi 
pushd `dirname ${SCRIPT_PATH}` > /dev/null 
SCRIPT_PATH=`pwd`; 
popd > /dev/null 

TCSH 셸에서과 동일한 조건으로 스크립트 경로 을 어떻게 얻을 수 있습니까? 이 '마술 라인'은 무엇입니까?

P. this 및 이와 유사한 질문이 중복되어 있지 않습니다. 나는 $0을 알고 있습니다.

+3

[tcsh에서 스크립팅을 피할 수 있다면 가능합니다.] (http://www.grymoire.com/Unix/CshTop10.txt) – Johnsyweb

+0

나는 당신에게 절대 동의합니다. 하지만 내 목표는 사용자 생활을 가능한 한 쉽게 만드는 것입니다. 그리고 그들이 어디서든 "source environment.csh"를 실행할 수 있다면 쉽게 할 수 있습니다. TCSH 요구 사항은 RHEL 6이이를 사용자의 기본 쉘로 사용하기 때문입니다. – MajesticRa

+0

tsch가 기본 쉘이기 때문에 tsch를 사용하는 경우 기본 쉘을 변경하지 않으시겠습니까? – carlpett

답변

0

나는 tcsh을 사용하지 않으며 도사용어 또는 다른 C 쉘 변종을 주장하지 않습니다. 나는 또한 확고하게 Csh Programming Considered Harmful에는 많은 진실이 있다고 믿는다; 나는 Korn shell이나 Bash를 사용한다.

그러나 수동 페이지를 볼 수 있으며 tcsh의 설명서 페이지 (MacOS 10.7.1 Lion의 tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-apple-darwin))를 사용했습니다.

위에서 볼 수 있듯이 변수 ${BASH_SOURCE[0]}에는 tcsh에 아날로그가 없으므로 질문에서 스크립트 조각의 시작점이 누락되었습니다. 따라서 설명서에없는 내용이 없거나 설명서가 불완전한 경우가 아니라면 tcsh에서 동일한 결과를 얻을 수있는 쉬운 방법이 없습니다.

원본 스크립트 조각에는 주석에 명시된 바와 같이 몇 가지 문제가 있습니다. 현재 디렉토리 /home/user1을 사용하여 스크립트가 호출되었지만 ../libexec/someprog/executable을 포함하는 심볼릭 링크 인 경우 코드 스 니펫이 잘못된 대답을 생성합니다 (디렉토리 /home/libexec/someprog이 존재하지 않기 때문에 /home/user1이 표시 될 가능성이 높습니다).

또한 while 루프를 if에 배치하는 것은 의미가 없습니다. 코드는 단순히 while 루프를 포함해야합니다.

SCRIPT_PATH="${BASH_SOURCE[0]}"; 
while [ -h "${SCRIPT_PATH}" ]; do SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done 

당신은 realpath() 기능을 찾아야한다; 이미 사용 가능한 명령을 사용할 수도 있습니다. realpath()을 사용하는 명령을 작성하는 것은 어렵지 않습니다. 그러나 내가 알 수있는 한 표준 리눅스 명령은 모두 realpath() 함수를 감싸는 것이 아니며 문제를 해결하는 데 도움이됩니다. 합니다 (statreadlink 명령은 특별히 도움이되지 않습니다.) 간단한에서

,이 같은 realpath()를 사용하는 프로그램을 작성할 수

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 

int main(int argc, char **argv) 
{ 
    int rc = EXIT_SUCCESS; 
    for (int i = 1; i < argc; i++) 
    { 
     char *rn = realpath(argv[i], 0); 
     if (rn != 0) 
     { 
      printf("%s\n", rn); 
      free(rn); 
     } 
     else 
     { 
      fprintf(stderr, "%s: failed to resolve the path for %s\n%d: %s\n", 
        argv[0], argv[i], errno, strerror(errno)); 
      rc = EXIT_FAILURE; 
     } 
    } 
    return(rc); 
} 

이 프로그램은, realpath 호출되면 다음 배쉬 스크립트를 당신의 CSH 스크립트가 test.csh 이름 경우

SCRIPT_PATH=$(realpath ${BASH_SOURCE[0]}) 
0

, 다음이 작동합니다 : 조각에 감소

,

/usr/sbin/lsof +p $$ | \grep -oE /.\*test.csh

관련 문제