Shebang을 사용하여 STDIN을 실행 가능하게 만들기

Shebang을 사용하여 STDIN을 실행 가능하게 만들기

데이터베이스 파일을 나열하는 프로그램이 있습니다.

다음과 같이 쉘에서 직접 호출됩니다.

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.

runparamshebang 줄인 경우 첫 번째 줄을 삭제하는 예제 스크립트:

#!/bin/sh
awk 'FNR>1 || ! /^#!/' "$@" | db

parameterfile:

#!/usr/bin/env runparam
filename
::
conditions

이것을 다음과 같이 실행할 수 있습니다.

./parameterfile

이 경우 스크립트는 shebang 줄이 항상 존재한다고 가정할 수 있습니다.

invocation 과 마찬가지로 매개변수 파일을 사용하여 스크립트를 직접 호출할 수도 있지만 db이점은 없습니다.

runparam parameterfile
runparam parameterfile1 parameterfile2 [...]
runparam < parameterfile

runparamShebang 줄이 포함되지 않은 파일로 절대 호출하지 않을 경우 무조건 첫 번째 줄을 제거하는 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. 이것이 가장 효율적일 것입니다.

관련 정보