문제 설명이 명확하지 않은 경우 죄송합니다.
나는 다른 많은 스크립트의 동작을 변경하기 위해 편집할 수 있는 bash 스크립트를 원합니다.
예를 들어, 저는 훌륭한 스크립트를 가지고 있습니다. Groovy 해석기 "groovy"를 사용하거나 "groovyclient"라는 특수 실행기를 사용하여 실행할 수 있습니다. 어느 것이 실행되는지 변경하고 싶을 수도 있습니다. 또는 Java 클래스 파일로 컴파일하고 Java를 사용하여 실행하는 것과 같이 완전히 다른 작업을 수행하고 싶을 수도 있습니다.
따라서 쉘 스크립트인 /home/me/groovy/groovyrun이라는 간접 스크립트가 있는 경우 다음과 같을 수 있습니다.
/usr/bin/groovy %*
또는 다음과 같습니다:
/home/me/groovy/groovyclient $*
#해보았습니다! 원본 스크립트의 줄은 다음과 같습니다.
#!/home/me/groovy/groovyrun
그리고 bash가 호출되지 않았으므로 groovyrun으로 무엇을 해야할지 몰랐다는 것을 빨리 깨달았습니다.
그런 다음 다음을 시도합니다.
#!/bin/bash /home/me/groovy/groovyrun
하지만 지금 내 생각에는 $*
이렇게 하면 실행되어야 하지만 원래 인수 목록을 가져오는 데 문제가 있다고 생각합니다(호출된 스크립트의 $*가 잘못되었을 수 있음).
이제 저는 이것을 어떻게 해야 할지 잘 모르겠습니다. 이것이 일반적인 패턴일지도 모른다고 생각합니다. 저는 Linux를 이해할 만큼(또는 심지어 그것을 찾는 방법도 알지 못할 만큼) Linux에 익숙하지 않아서 묻습니다.
#!을 삭제하면 쉽게 해결할 수 있고 그루비 스크립트를 쉘 스크립트에 직접 전달할 수 있지만 그게 무슨 재미가 있겠습니까?
답변1
내가 올바르게 이해했다면 통과하는 간접적인 수준을 만들고 싶을 것입니다.셰르본스크립트 자체에는 shebang이 있는 스크립트가 있습니다.Linux는 중첩된 shebang을 허용하지만 다른 Unix 변형은 허용하지 않습니다.. 그래서 당신은 넣을 수 있습니다
#!/home/me/groovy/groovyrun
Groovy 스크립트 상단에
#!/bin/sh
상단에 /home/me/groovy/groovyrun
.
래퍼 스크립트 내에서 실행하려면 다음과 같은 것을 사용 groovyclient
하십시오 .groovy
#!/bin/sh
if …; then
exec groovyclient "$@"
else
exec groovy "$@"
fi
"$@"
스크립트에 전달된 인수 목록을 그대로 복사하여 나타냅니다(인수 등의 공백은 올바르게 보존됩니다). $*
인수를 중간 공백으로 연결하는( groovyrun 'foo bar'
로 변질됨 ) 을 사용하지 마십시오 groovyrun 'foo' 'bar'
.따옴표 없이 변수를 확장하지 마세요.. 에 대해 exec
참조하세요래퍼 스크립트에서 exec가 필요한 이유
답변2
스크립트에 shebang을 지정하면 작동합니다 groovyrun
.
빠른 실험으로 다음 shell1
을 포함하는 패키지를 만듭니다.
#!/bin/sh
echo shell1: "$@"
sh "$@"
그리고 shell2
포함
#!/.../shell1
echo shell2: "$@"
(올바른 경로로 shell1
) 실행 shell2 Hello
하면 생성됩니다 .
shell1: ./shell2 Hello
shell2: Hello
보시다시피, 각 스크립트에 전달된 매개변수는 두 경우 모두 올바르게 보입니다.