소프트 링크를 생성한 스크립트(~/.../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는 심볼릭 링크의 전체 크기를 계산하지만 아무 것도 표시하지 않습니다.)
추가 자료:
- 점 3개 와일드카드
- ...(점 3개)를 사용하여 상위 디렉토리를 참조하는 기능은 어떻게 되었나요?
- 4.5.1 줄임표 와일드카드(1980년대 VMS의 특징)