다른 프로그램에 대해 몇 가지 사항을 변경하는 스크립트가 있습니다. 그 중 하나는 다른 플래그 집합과 함께 프로그램을 호출하는 것입니다.
플래그가 길고 오류가 발생하기 쉽고 기억하기 어렵 기 때문에 필자가 작성한이 스크립트는 해당 실행 파일을 덮어 쓰려고하므로 사용자가 스크립트를 호출 할 때 실제로 스크립트에 여분의 복잡한 인수가 추가되어 호출됩니다. 나는 적어도 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
접근법 (예를 들어 bashrc
zshrc
또는 이들의 선언) 일 것이다. 또한 이러한 변경 사항은 일시적이어야하며 사용자가 설정하려고 할 수도 있고하지 않을 수도 있음에 유의해야합니다. 이러한 변경 사항이 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
.
두 개의 첫 번째 항목 (alias
및 function
)이 적합하지 않으며 세 번째 항목 ($PATH
변경)이 신뢰할 수없는 것으로 나타납니다.
이 작업을 수행하는 적절한 방법이 있어야한다는 것을 알고 있습니다. 하위 셸의 제한 사항을 이해하고 한 스크립트의 내용을 변경하고 유지하게하지만이 파일의 원본을 $PATH
으로 변경하거나 export PATH=/path/to/foo:$PATH
"이것이 신뢰할 수있는 유일한 방법입니까?
자주 변경되는 길고 복잡한 인수가 있습니까? '고스트 스크립트 '같은데. 어쨌든,'/ usr/local/bin/whatever'을'/ usr/local/bin/whatever.installed'로 옮기고'/ usr/local/bin/whatever' exec'는 설치된 버전을 표시합니다. – bishop