移植性のために、次のことを安全に想定できます。 #!/bin/sh
は、標準のUnixまたはLinuxシステムでほとんどPOSIX準拠のシェルを見つけますが、それだけです。
FreeBSD、OpenBSD、およびNetBSD( DragonFly、PC-BSD、およびその他の派生物とともに)、bashは/usr/local/bin/bash
(インストールされている場合)にあるため、/usr/bin/env
このアプローチは、LinuxとBSD間の移植性を提供します。
Androidは標準のUnixまたはLinuxシステムではありません。ルート化されていないAndroid電話では、/usr/bin/env
、/bin/bash
o r /bin/sh
も存在し、システムシェルは/system/bin/sh
です。
(shebang)は、一部のシステムでそれを呼び出したシェルで実行しようとするか、別のデフォルトのインタープリター(/bin/bash
など)を使用する場合があります。 、他のシステムで。また、これはAndroidで機能する可能性がありますが、ユーザーがbash
。(私はFreeBSDでtcshを使用しています。これはデフォルトのシェルであり、シバンのないスクリプトは呼び出し元のシェルによって解釈されます。)
つまり、私が座っているところからは、 Androidの動作が異なるため、AndroidシステムとAndroid以外(LinuxまたはUnix)システム間で移植可能なシェルスクリプトを作成することはできません。
コメント
- 私の経験では、
/bin/sh
はbsh
やdash
はbash
よりも、比較的肥大化しており、インタラクティブな使用に適しています。
- ここにはいくつかの間違いがあります。まだ多くの(ほとんどが商用)
/bin/sh
がボーンシェルであるこのあたりのユニス(ほとんどはSolaris 10以前) l、POSIXシェルではなく、POSIXは' sh
のパスを指定しません。ほとんどのシェル(およびexecp
/ env
/ find -exec...
)はshe-bang-を解釈しますシステム'のsh
を使用したスクリプトが少なく、自分で解釈するものはほとんどなく、解釈する場合はPOSIX互換モードで実行します。これは、'がスクリプトを実行する標準/ POSIXの方法ですが、呼び出し元が POSIX環境にいることを前提としています。
- <についてb> * BSD
bash
はオプションです。これは、/usr/local/bin/bash
でさえシステムに存在しない可能性が高いことを意味します(Solaris、AIX、HP-Uxなどのプロプライエタリシステムは言うまでもありません)。
- @ StephaneChazelas-POSIXに関しては、もちろん同意します。'が、私が使用した単語が"ほとんどPOSIX準拠であった理由です"。しかし、この質問はPOSIXを見つける場所ではなく、移植性に関するものであり、'常に1つの場所にあるシェルに依存することはできません。デフォルトのインタプリタに関しては、tcshで実行されるシバンのないスクリプトは、FreeBSDのtcshによって解釈されます。明らかに、そこにも'の矛盾があるので、それに応じて'回答を更新しました。
- @ Ouki-はい、もちろん、私は'それが質問に関連しているとは思いませんでした。しかし、私は'明確にするために、その説明を回答に追加しました。
私の経験では、#!/bin/sh
と#!/bin/bash
は、私が取り組んだいくつかのシステムで常に適切な環境を見つけることになりました。 。私はまだ例外に遭遇していません。また、さまざまな対象者のために移植性を念頭に置いて書かれていると思われるシェルスクリプト関連のテキストで日常的に使用されていることもわかりました。
#!/usr/bin/env
。一部のシステムでは、#!/bin/env
としてインストールされており、過去にPythonスクリプトが壊れています。したがって、2番目の箇条書きを使用します。
上記のステートメントをサポートするものがいくつかあります。
CentOSリリース5.7では、次のようになります。
$ which env /bin/env
Ubuntu 12.04 Precise Pangolinの場合:
$ which env /usr/bin/env
さらに、少なくとも1つの古いシステムでは、管理者を覚えています。何らかの理由でcoreutils
を/opt
にインストールしました(ベストプラクティスではない可能性があります)。env
はcoreutils
の一部であり、ユーザーは最終的に/opt/coreutils/bin/env
で取得しました。確かに、私はそこにあるすべてのシステムを使用したわけではないので、答えは私の限られた経験に基づいています。
コメント