데이터베이스 파일을 나열하는 프로그램이 있습니다.
다음과 같이 쉘에서 직접 호출됩니다.
db filename
전체 파일을 나열하거나 다음과 같은 것을 나열하십시오.
db 'filename :: conditions'
선택한 요소만 나열...
또 다른 방법은 모든 매개변수를 포함하는 파일을 사용하여 호출하는 것입니다.
db < parameterfile
내용은 다음과 같습니다(위의 ''와 정확히 동일).
filename
::
conditions
이제 그러한 파일을 실행 가능하게 만들고 싶습니다. 그래서 전화를 걸 수 있어요 ./parameterfile
.
나는 주석 기호가 아니기 #!/usr/bin/env db
때문에 shebang을 사용하는 것이 실패했다고 생각합니다 . #
오류 메시지가 나타납니다
db - Line 1 near ""#.//r" - " - syntax error
shell returned 26
이를 수행할 수 있는 한 줄의 코드가 있습니까?
답변1
awk를 shebang 래퍼로 사용합니다.
#! /usr/bin/awk BEGIN{getline;cmd="db"}{print|cmd}END{exit(close(cmd))}
... "db" commands here ...
귀하의 스크립트가아니요execve(2)
직접 실행해야 하지만 셸(또는 유사한 명령)을 통해서만 find -exec
실행 가능하게 만드는 것을 포함하여 더 많은 옵션이 있습니다.아니요앞에 shebang을 추가하고 명령이 이해하는 모든 언어의 유효한 명령 스크립트로 남겨두십시오 db
. 그것은 모두 언어가 무엇인지에 달려 있습니다. 예를 들어 언어의 주석 행이 //
(C++에서와 같이)로 시작하는 경우 다음을 사용할 수 있습니다.
// 2>/dev/null; exec db "$0" "$@"
... "db" commands here ...
답변2
shebang 줄을 제거하고(있는 경우) 결과를 에 전달하는 쉘 스크립트를 작성할 수 있습니다 db
. PATH
그렇지 않으면 shebang 줄에 스크립트의 전체 경로를 지정해야 할 수도 있습니다. 이 스크립트를 parameterfile
.
runparam
shebang 줄인 경우 첫 번째 줄을 삭제하는 예제 스크립트:
#!/bin/sh
awk 'FNR>1 || ! /^#!/' "$@" | db
예 parameterfile
:
#!/usr/bin/env runparam
filename
::
conditions
이것을 다음과 같이 실행할 수 있습니다.
./parameterfile
이 경우 스크립트는 shebang 줄이 항상 존재한다고 가정할 수 있습니다.
invocation 과 마찬가지로 매개변수 파일을 사용하여 스크립트를 직접 호출할 수도 있지만 db
이점은 없습니다.
runparam parameterfile
runparam parameterfile1 parameterfile2 [...]
runparam < parameterfile
runparam
Shebang 줄이 포함되지 않은 파일로 절대 호출하지 않을 경우 무조건 첫 번째 줄을 제거하는 tail
대신 사용하면 됩니다. awk
이것이 더 빠를 수도 있습니다.
#!/bin/sh
tail -n+2 | db
답변3
그냥 쉘 스크립트로 만들어 보세요. 다음 중 하나:
exec db << 'EOF'
filename
::
conditions
EOF
db
(쉘에 따라 여기에 있는 문서의 내용은 실행되고 실행되기 전에 삭제될 프로세스의 표준 입력이 될 임시 파일에 저장되거나 db
데이터를 공급하는 쉘 프로세스가 있는 파이프가 됩니다. 그것을 통해) .
또는:
tail -n+2 < "$0" | db
filename
::
conditions
tail
. 사이에 파이프(또는 ksh93이 있는 소켓 쌍)가 있습니다 db
.
또는:
exec < "$0"; IFS= read -r ignore; exec db
filename
::
conditions
여기서는 db
스크립트에서 직접 stdin을 열고 read
. 이것이 가장 효율적일 것입니다.