~からシェルコマンド言語POSIX仕様ページ:
シェルコマンドファイルの最初の行が「#!」文字で始まる場合、結果は指定されません。
#!
POSIXが指定されていない動作であるのはなぜですか?移植性に優れ、広く使用されているものが指定されていない動作を持つべきであることは恥ずかしいです。
ベストアンサー1
私は主に次の理由によると思います。
動作は実装ごとに大きく異なります。バラよりhttps://www.in-ulm.de/~mascheck/various/shebang/すべての詳細を確認してください。
ただし、ほとんどの Unix 様実装の最小サブセットを指定できるようになりました。たとえば、
#! *[^ ]+( +[^ ]+)?\n
(移植可能なファイル名の文字セットの文字のみを含む 1 つまたは 2 つの単語で)、最初の単語はデフォルトの実行可能ファイルの絶対パスの単語ですが、実行可能ファイルが setuid/setgid、実装がインタプリタパス、またはスクリプトパスがインタプリタに渡さargv[0]
れるするかどうかを定義すると、長すぎず、アクションは指定されません。POSIX はとにかく実行可能ファイルのパスを指定しません。一部のシステムには
/bin
/にPOSIX以前のユーティリティがあり、/usr/bin
他の場所にはPOSIXユーティリティがあります(たとえば、Solaris 10には/bin/sh
Bourneシェルがあり、POSIXユーティリティはにあります/usr/xpg4/bin
。は置き換えられました。のツールは/bin
まだPOSIXではなく古代のツールです。一部のシステムはPOSIXシステムではありませんが、POSIXモード/エミュレーションを備えています。すべてのPOSIX要件は、システムがPOSIX方式で動作できる文書化された環境です。たとえば、Windows + Cygwinを参照してください。実際、Windows + Cygwinの場合、デフォルトのWindowsアプリケーションではなくcygwinアプリケーションからスクリプトを呼び出すと、シェーバンが尊重されます。
したがって、POSIXがshebangメカニズムを指定してもPOSIX
sh
//sed
...awk
スクリプトを作成するために使用することはできません(また、shebangメカニズムは閉じるオプションマーカーを渡すことを許可しないため、信頼できるsed
/スクリプトを作成するためには使用できません)。awk
#!
今、指定されていないという事実がそれを使用できないという意味ではありません。しかし、そうすることで、POSIXはいかなる保証も提供しません。
私の経験では、shebangを使用すると、POSIXシェルスクリプトを書く方法よりも優れた移植性が保証されます。 she-bangを捨て、sh
POSIX構文でスクリプトを作成し、そのスクリプトを呼び出すすべてがPOSIX互換スクリプトを呼び出すことを願っています。sh
つまり、大丈夫です。スクリプトが正しい環境で正しいツールによって呼び出されることを知っていれば、そうでなければそうではありません。
以下を行う必要があります。
#! /bin/sh -
if : ^ false; then : fine, POSIX system by default
else
# cover Solaris 10 or older. ": ^ false" returns false
# in the Bourne shell as ^ is an alias for | there for
# compatibility with the Thompson shell.
PATH=`getconf PATH`:$PATH; export PATH
exec /usr/xpg4/bin/sh - "$0" ${1+"$@"}
fi
# rest of script
Windows + Cygwinに移植するには、ファイル名を.bat
拡張子として指定し、同様のトリックを使用して同じファイルからcygwinを呼び出す必要があります。.ps1
cmd.exe
powershell.exe
sh