#!
shebang line()を介して実行可能ファイルに複数のオプションを渡す一般的な方法があるかどうか疑問に思います。
私はNixOSを使用していますが、私が書いたすべてのスクリプトでshebangの最初の部分は一般的です/usr/bin/env
。問題は、次のすべてがシステムによって単一のファイルまたはディレクトリとして解釈されることです。
bash
たとえば、posixモードで実行されるスクリプトを作成するとします。 Shebangを書く簡単な方法は次のとおりです。
#!/usr/bin/env bash --posix
ただし、生成されたスクリプトを実行しようとすると、次のエラーが発生します。
/usr/bin/env: ‘bash --posix’: No such file or directory
わかりましたこの投稿しかし、より一般的でクリーンなソリューションがあるかどうかを知りたいです。
編集する:私も知ってるいたずらスクリプト、私が欲しいものを達成する方法があります。セクション4.3.4マニュアル:
#!/usr/bin/env sh
exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@"
!#
ここでの秘訣は、2 行目 ( but で始まる ) が code , ... ブロック内部の注釈exec
として解釈されるので Guile ソルバーで無視されるということです。sh
#!
!#
このアプローチをすべての通訳者に一般化することはできませんか?
2番目の編集:いくつかの試みの後にstdin
入力を読むことができるインタプリタについては、次のことがうまくいくようです。
#!/usr/bin/env sh
sed '1,2d' "$0" | bash --verbose --posix /dev/stdin; exit;
sh
ただし、通訳者が作業を完了するまでプロセスが続くため、これは最適ではない可能性があります。どんなフィードバックや提案にも感謝します。
ベストアンサー1
完全に移植可能ではありませんが、coreutils 8.30からその文書によると以下を使用できます。
#!/usr/bin/env -S command arg1 arg2 ...
だから与えられた:
$ cat test.sh
#!/usr/bin/env -S showargs here 'is another' long arg -e "this and that " too
あなたは得るでしょう:
% ./test.sh
$0 is '/usr/local/bin/showargs'
$1 is 'here'
$2 is 'is another'
$3 is 'long'
$4 is 'arg'
$5 is '-e'
$6 is 'this and that '
$7 is 'too'
$8 is './test.sh'
気になるならshowargs
:
#!/usr/bin/env sh
echo "\$0 is '$0'"
i=1
for arg in "$@"; do
echo "\$$i is '$arg'"
i=$((i+1))
done