可変コンテンツをShebangとして使用できますか? [閉鎖]

可変コンテンツをShebangとして使用できますか? [閉鎖]

shebangを追加したいシェルスクリプトがあります。次のように定義された変数が与えられた場合:

SHEBANG="#!/bin/sh"

私の質問は、この変数を次のような他のスクリプトで使用できるかどうかです。

$SHEBANG
# other stuff...

ベストアンサー1

習慣。 Shebang行はカーネルまたはシステムライブラリ*によって処理され、シェル変数を処理しません。

  • 何らかの理由で環境変数をインタプリタとして使用したい場合は、再生成された「トランポリン」実行可能ファイル(スクリプトではありません!)を作成できます$SHEBANG "$@"。この場合、#!変数からを省略する必要があります。#!実際にはファイルの最初の2バイトの場合にのみ役立ちます。

  • もう一つの選択肢は、以下を活用することです。実際、shebang行を持たないスクリプトは(通常)sh呼び出しシェルと共にシェルスクリプトとして実行されます。。 Shebangターゲットにシェル構文と効果的に重なるコメント構文がある場合は、これを機能させることができます。この戦略は、Lispソルバーで一般的または一般的でした。あなたの例では、インタプリタも同様ですが、shこれは不可能です。

  • 現在の状態を信頼できる場合は、次の行でより多くの内容を進めることができますbash。最初の行は次のスクリプトです。

    exec /bin/bash -c 'exec "$SHEBANG" <(tail -n +2 "$0")' "$0" "$@"
    

    ほとんどの通訳に適しています。 Bashは中間段階として使用されます。プロセスの交換所有するために使用することができます。tail無限ループに陥らないように、最初の行をスキップしてください。一部の通訳者はファイルを検索できるように要求し、そのようなパイプを許可しません。


これは本当にあなたが望むものであると思う価値があります。セキュリティ上の問題を除いて、あまり役に立ちません。このようにソルバーを変更できるスクリプトはほとんどなく、可能であれば適切な状況をよりよく生成するより制限された論理ブロックをほぼ確実に使用することになります。正しい論理ブロック(おそらく実際のスクリプトへのパスを引数として使用してインタプリタを呼び出す中間シェルスクリプト)。


* 常にそうではありません。一部のシェルは自分自身を読み込みますが、それでも変数の拡張は行いません。

おすすめ記事