나는 이것이 "디자이너가 의도한 것이 아니다"라고 들릴 수도 있다는 것을 알고 있지만, 내가 수정하고 있던 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
다른 쉘에서는 작동합니다 ).dash
ksh
꼭 해야 한다면원천바꾸다부르다수정 불가능한 스크립트의 경우 외부 스크립트를 호출하는 래퍼에서 동일한 트릭을 사용하거나 자체적으로 다시 호출하도록 할 수 있습니다.
$ 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 스크립트가 아니더라도 작동합니다.