GNU/Linux >> Linux の 問題 >  >> Linux

シバンの複数の議論?

シバン行(#!)を介して実行可能ファイルに複数のオプションを渡す一般的な方法があるかどうか疑問に思っています。 。

私はNixOSを使用しており、作成するスクリプトのシバンの最初の部分は通常 / usr / bin / envです。 。そのとき私が遭遇する問題は、その後に続くすべてのものがシステムによって単一のファイルまたはディレクトリとして解釈されることです。

たとえば、 bashによって実行されるスクリプトを記述したいとします。 posixモードで。シェバンを書く素朴な方法は次のようになります:

#!/usr/bin/env bash --posix

ただし、結果のスクリプトを実行しようとすると、次のエラーが発生します。

/usr/bin/env: ‘bash --posix’: No such file or directory

私はこの投稿を知っていますが、もっと一般的でクリーンな解決策があるかどうか疑問に思いました。

編集 :Guileスクリプトの場合、マニュアルのセクション4.3.4に記載されているように、私が望むことを達成する方法があることを知っています:

 #!/usr/bin/env sh
 exec guile -l fact -e '(@ (fac) main)' -s "$0" "[email protected]"
 !#

ここでの秘訣は、2行目( exec で始まる)です。 )は shによってコードとして解釈されます しかし、#!にいる …!# コメントとしてブロックするため、Guileインタプリタによって無視されます。

この方法をどの通訳者にも一般化することはできませんか?

2番目の編集 :少し遊んだ後、 stdinから入力を読み取ることができる通訳者にとってはそうです 、次の方法が機能します:

#!/usr/bin/env sh
sed '1,2d' "$0" | bash --verbose --posix /dev/stdin; exit;

ただし、 sh としては、おそらく最適ではありません。 プロセスは、通訳者が仕事を終えるまで存続します。フィードバックや提案をいただければ幸いです。

承認された回答:

Linuxカーネルは、シバン行の最初の「単語」に続くすべてのものを単一の引数として扱うため、少なくともLinuxをサポートする必要がある場合は、一般的な解決策はありません。

NixOSの制約が何であるかはわかりませんが、通常はシバンを次のように記述します

#!/bin/bash --posix

または、可能であれば、スクリプトでオプションを設定します。

set -o posix

または、適切なシェル呼び出しを使用してスクリプトを再起動させることもできます。

#!/bin/sh -

if [ "$1" != "--really" ]; then exec bash --posix -- "$0" --really "[email protected]"; fi

shift

# Processing continues

このアプローチは、最初の数行(シェルによって解釈される)がターゲット言語によって無視される方法を見つければ、他の言語に一般化することができます。

関連:ファイルに複数の行を追加するにはどうすればよいですか?

GNU coreutils env バージョン8.30以降の回避策を提供します。詳細については、unodeの回答を参照してください。 (これは、Debian 10以降、RHEL 8以降、Ubuntu 19.04以降などで使用できます)


Linux
  1. Linuxで複数のファイルを圧縮する方法

  2. パラメータをエイリアスに渡す方法は?

  3. Stdoutを複数のコマンドに送信する方法は?

  1. Xargsを介して複数のパラメーターを渡す?

  2. Sshpassの複数のコマンド?

  3. Dd:複数の入力ファイル?

  1. 単一ホスト上の複数の glibc ライブラリ

  2. 複数の Python スクリプトを同時に実行する

  3. PDF のページを複数のページに分割する