하위 bash 스크립트에 다른 $0을 전달할 수 있습니까?

하위 bash 스크립트에 다른 $0을 전달할 수 있습니까?

나는 이것이 "디자이너가 의도한 것이 아니다"라고 들릴 수도 있다는 것을 알고 있지만, 내가 수정하고 있던 bash 스크립트가 수정이 허용되지 않은 다른 bash 스크립트를 호출해야 하는 실제 상황에 직면했습니다.

"수정할 수 없는 bash 스크립트"는 다음으로 시작됩니다.

source `dirname $0`/setenv.sh

( setenv.sh또한 다음으로 시작하며 SCR2PATH=source "$( cd "$(dirname "$0")" ; pwd -P )"수정할 수 없습니다)

$0호출 스크립트와 다른 방법을 사용하도록 첨자를 속일 수 있는 트릭이 있습니까?

답변1

어쩌면 이렇게 할 수도 있습니다:

bash -c '. /path/to/unmodifiable' /fake/path args ...

분명히 /path/to/unmodifiable이것은 쉘 스크립트여야 합니다. 이 어리석은 트릭은 다른 유형의 실행 파일에서는 작동하지 않습니다. 이것도 작동하지 않습니다 (그러나 등 의 zsh다른 쉘에서는 작동합니다 ).dashksh

꼭 해야 한다면원천바꾸다부르다수정 불가능한 스크립트의 경우 외부 스크립트를 호출하는 래퍼에서 동일한 트릭을 사용하거나 자체적으로 다시 호출하도록 할 수 있습니다.

$ cat unmodifiable
#! /bin/sh
printf '{%s} ' "$0" "$@"
echo

$ cat becoming
#! /bin/sh
[ "$MYSELF" ] || MYSELF=$0 exec sh -c '. "$MYSELF"' "I'm the mountain!" "$@"
. ./unmodifiable

$ chmod 755 becoming
$ ./becoming 1 2 3
{I'm the mountain!} {1} {2} {3}

답변2

아래 첨자를 "속일" 수는 없지만 호출된 스크립트에 대한 심볼릭 링크를 만들고 해당 심볼릭 링크를 호출하여 다른 이름으로 호출할 수 있습니다. 나는 이것이 당신이 찾고 있는 것을 달성할 것이라고 믿습니다.

예:

$ cat ./bin/script.sh
echo $0

$ ./bin/script.sh
./bin/script.sh
$ ln -s bin/script.sh foo.sh
$ ./foo.sh
./foo.sh

답변3

exec -a서브쉘에서 이것을 사용할 수 있습니다 :(exec -a fakeDollarZero /unmodifiable/bash/script the rest of the args)

같지 않은Mosvi의 답변, 이는 bash 스크립트가 아니더라도 작동합니다.

관련 정보