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行のコードはありますか?

答え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行を削除し(存在する場合)、結果をに渡すシェルスクリプトを作成できますdbPATHそれ以外の場合は、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。これが最も効率的です。

関連情報