$PATH에 있을 때 $0을 사용하는 스크립트를 작동시키는 방법은 무엇입니까?

$PATH에 있을 때 $0을 사용하는 스크립트를 작동시키는 방법은 무엇입니까?

다음에 대한 소프트 링크를 만든 스크립트(~/.../gremlin)가 있습니다.

ln -s ~/[...]/gremlin ~/sc/gremlin

~/sc/gremlin에 있습니다 $PATH.
스크립트를 직접 호출하면 작동합니다.
링크를 통해 호출하는 것은 그렇지 않습니다. 그것은 아무것도 얻지 못하도록
사용됩니다 .dirname $0

스크립트를 변경하지 않고 소프트 링크 대신 다른 스크립트를 만들지 않고도 이 설정이 작동하도록 하는 방법이 있습니까?

$0이 사용되는 방식은 다음과 같습니다.

case `uname` in
  CYGWIN*)
    CP=$( echo `dirname $0`/../lib/*.jar . | sed 's/ /;/g')
    ;;
  *)
    CP=$( echo `dirname $0`/../lib/*.jar . | sed 's/ /:/g')
esac

답변1

의 사용이 dirname $0문제인지 아닌지는 다음에 달려 있습니다.어떻게사용됩니다. 자세한 내용이 없으면 답변을 드릴 수 없습니다.

(a) 사용에 dirname $0문제가 있고 (b) 스크립트를 변경할 수 없는 경우 해결 방법은 소프트 링크를 ~/sc/gremlin스크립트로 바꾸는 것입니다.

#!/bin/sh
exec ~/../gremlin "$@"

이런 식 ~/../gremlin으로 올바른 $0.

를 사용한다는 exec것은 스크립트를 실행하는 프로세스가 ~/../gremlin실행 중인 프로세스를 대체한다는 의미입니다 ~/sc/gremlin. 이는 ~/../gremlin완료될 때까지 두 프로세스를 모두 유지하는 것보다 더 효율적입니다.

답변2

스크립트 내에서 가 아니라 ~/...에서 디렉터리를 파생시키려면 다음을 수행할 수 있습니다.$0~/sc

스크립트 인 경우 zsh:

#! /bin/zsh -
dir=$0:A:h

readlink그렇지 않고 GNU 명령처럼 작동하는 명령이 있는 경우 (일부 시스템에는 realpath대신 사용할 수 있는 명령이 있습니다):

#! /bin/sh -
dir=$(dirname -- "$(readlink -f -- "$0")")

readlink -f그리고 $0:A당신에게표준적인즉, 모든 경로 구성 요소의 모든 심볼릭 링크를 확인한 후의 절대 경로입니다.

그런 다음:

set -- "$dir"/../lib/*.jar .
case $(uname) in
  CYGWIN*) IFS=';';;
  *)       IFS=:;;
esac
CP="$*"

또는:

case $(uname) in
  CYGWIN*) sep=';';;
  *)       sep=:;;
esac
CP=$(printf "%s$sep" "$dir"/../lib/*.jar).

답변3

@ john1024가 지적했듯이 OP 질문의 오타가 질문의 요점일 수 있습니다.

ln -s ~/.../gremlin ~/sc/gremlin

일부 응용 프로그램은 삼중 점을 존중하지만 Unix 파일 시스템은 그렇지 않습니다. 당신의껍데기~아닌 (물결표)를 확장 하므로ln

    ln -s ~/../gremlin ~/sc/gremlin

예상대로 경로 이름을 확장합니다. 링크가 이미 존재하는 경우 -f옵션을 사용하여 덮어쓸 수 있습니다. 그러나 대상이 실제 파일인 경우 -f옵션은 기호 링크로 파일을 자동으로 덮어씁니다. -i적어도 이미 뭔가가 있다는 것을 알려주는 옵션을 사용하고 싶을 수도 있습니다 .

링크의 유효성을 검사하려면(파일을 가리키는지 증명) -L다음 옵션이 ls유용합니다.

ls -lL ~/sc/gremlin

파일이 아닌 경우 ls(구현에 따라) l유형(목록의 첫 번째 문자)과 권한 비트에 대한 물음표만 표시하거나 실제 파일을 가리키지 않는다는 기타 표시를 표시합니다. (OSX는 전체 심볼릭 링크의 크기를 계산하지만 이 경우 아무것도 표시하지 않습니다.)

추가 자료:

관련 정보