データベースファイルを一覧表示するプログラムがあります。
次のようにシェルから直接呼び出されます。
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行を削除し(存在する場合)、結果をに渡すシェルスクリプトを作成できます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
。これが最も効率的です。