$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는 심볼릭 링크의 전체 크기를 계산하지만 아무 것도 표시하지 않습니다.)

추가 자료:

관련 정보