2014-03-02 3 views
0

다른 프로그램에 대해 몇 가지 사항을 변경하는 스크립트가 있습니다. 그 중 하나는 다른 플래그 집합과 함께 프로그램을 호출하는 것입니다.

플래그가 길고 오류가 발생하기 쉽고 기억하기 어렵 기 때문에 필자가 작성한이 스크립트는 해당 실행 파일을 덮어 쓰려고하므로 사용자가 스크립트를 호출 할 때 실제로 스크립트에 여분의 복잡한 인수가 추가되어 호출됩니다. 나는 적어도 3 가지 방법을 알고

위를 달성하기 :

function foo { 
    /usr/bin/foo --compicated-flag ComplexArgument 
} 
  • 알터 그래서 비는 그 $PATH : alias foo=/usr/bin/foo --compicated-flag ComplexArgument

  • 함수를 만듭니다

    • 는 별칭을 만듭니다 foo 파일의 표준 위치는 사용자의 실제 내용 인 foo보다 먼저 호출됩니다.

      /usr/bin/foo --compicated-flag ComplexArgument 
      

    내 문제는 사용자가 한 명령 이러한 설정됩니다 도우미 스크립트를 실행 할 수 있도록하려는 것입니다. 매번 "이 파일을 가져 오거나 $PATH을 내 보내야합니다."와 같은 두 번째 작업으로 사용자에게 메시지를 표시하고 싶지 않습니다. ComplexArgument 이후

    프로그래밍 계산하고 많이 변경되지 아니하며 (가) alias이나 function 접근법 (예를 들어 bashrczshrc 또는 이들의 선언) 일 것이다. 또한 이러한 변경 사항은 일시적이어야하며 사용자가 설정하려고 할 수도 있고하지 않을 수도 있음에 유의해야합니다. 이러한 변경 사항이 RC 셸 파일에 추가되어서는 안되는 이유가 더 있습니다.

    내가 다시 떨어지는 유일한 항목은 $PATH입니다.

    환경 변수를 변경하고 하위 쉘에 영향을 주려면 exec을 호출해야한다는 것을 알고 있습니다. $PATH는 서브 쉘에 "스틱"것

    export PATH=/path/to/other/foo:$PATH 
        exec $SHELL 
    

    이 방법 :처럼 뭔가.

    제외하고 특정 환경에서는 가장 확실하지 않습니다.

    예를 들어 OSX에서 HomeBrew가 설치된 경우 /usr/local/bin이 먼저 오도록 HomeBrew가 설치되는 라이브러리가 먼저 오도록 $PATH을 변경하는 것이 좋습니다. 사용자가 자신 .zshrc처럼 그것을 정의하는 경우

    는 :

    PATH=/usr/local/bin:$PATH 
    

    에 관계없이 내 스크립트 설정 무엇을, zsh을가 .zshrc 파일을 읽고 /usr/local/bin 먼저 얻을 것을 의미합니다.

    나는 사용자의 RC 파일을 읽는 피하기 위해 zsh을의 플래그 중 하나를 사용하는 경우, 다른 일들이 $PATH는 더 이상 올바르게 설정하지 않으며되기 때문에, 작동이 중지됩니다 zsh을 몇 가지 시스템이있다 항상 전화 /etc/zshenv : 그 또한 어떤 경로가 전에없이 $PATH 전에 무엇의 올 보장하기 위해 $PATH 변경 이후 더욱 심각하게

    # system-wide environment settings for zsh(1) 
    if [ -x /usr/libexec/path_helper ]; then 
        eval `/usr/libexec/path_helper -s` 
    fi 
    

    .

    두 개의 첫 번째 항목 (aliasfunction)이 적합하지 않으며 세 번째 항목 ($PATH 변경)이 신뢰할 수없는 것으로 나타납니다.

    이 작업을 수행하는 적절한 방법이 있어야한다는 것을 알고 있습니다. 하위 셸의 제한 사항을 이해하고 한 스크립트의 내용을 변경하고 유지하게하지만이 파일의 원본을 $PATH으로 변경하거나 export PATH=/path/to/foo:$PATH "이것이 신뢰할 수있는 유일한 방법입니까?

  • +0

    자주 변경되는 길고 복잡한 인수가 있습니까? '고스트 스크립트 '같은데. 어쨌든,'/ usr/local/bin/whatever'을'/ usr/local/bin/whatever.installed'로 옮기고'/ usr/local/bin/whatever' exec'는 설치된 버전을 표시합니다. – bishop

    답변

    0

    네 번째 옵션은 복잡한 기능을 둘러싼 래퍼입니다. 따라서 복잡한 스크립트의 이름을 complicated에서 complicated.orig으로 바꾼 다음 인수를 계산하는 새 complicated을 작성한 다음 새로 계산 된 인수로 exec의 complicated.orig을 작성하십시오. 그렇게하면 별칭이나 기능을 사용하기 위해 로그인 프로필을 업데이트하는 모든 사용자에게 의존하지 않고 스크립트 경로는 사용자에게 있었던 것처럼 나타납니다.

    0

    소프트웨어 패키지 배포시 도우미 스크립트를 제공하는 것은 매우 일반적인 기술입니다. service apache2 restart이 정확히 무엇을 묘사하는지 생각해보십시오.

    관련 문제