다음에 대한 소프트 링크를 만든 스크립트(~/.../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는 전체 심볼릭 링크의 크기를 계산하지만 이 경우 아무것도 표시하지 않습니다.)
추가 자료: