2

ファイルの変更時刻を取得するために sh ファイルを作成しています。shファイルがMacとUbuntuの両方で機能することを望みます。

/bin/sh を使用し、bash ファイルの最初の行に #!/bin/sh を追加します。/bin/sh は 2 つの OS で同じように動作するはずです。しかし、そうではありません。以下に、違いの 2 つの例を示します。

  1. 以下のスクリプトは Mac では機能しますが、Ubuntu では機能しません。

    modTime=$(stat -f "%m" -t "%s" $filepath)

  2. また、以下のスクリプトは Ubuntu では機能しますが、Mac では機能しません。

    modTime=$(date +%s -r $filepath)

私の質問は次のとおりです。

  1. Mac と Ubuntu で /bin/sh の動作が異なるのはなぜですか?
  2. クロスプラットフォームの sh スクリプトを作成したい場合、プラットフォームに依存するコードを避けるにはどうすればよいですか?
4

2 に答える 2

7
  1. Mac と Ubuntu で /bin/sh の動作が異なるのはなぜですか?

両方とも異なるシェルだからです。ubuntu の sh はダッシュ シェル、minix の sh は ash シェル、slackware の sh は bash シェルです。また、OSX の sh はそれほど長くないため、bash シェルも同様です。

同じ動作が必要な場合は、シェルを指定してください。 .use #!/bin/bash を使用して文字通り bash を意味すると言い、 #!/bin/ksh を使用して文字通り korn-shell を呼び出します。

  1. クロスプラットフォームの sh スクリプトを作成したい場合、プラットフォームに依存するコードを避けるにはどうすればよいですか?
  1. 公式: POSIX 準拠のシェルで実行するために POSIX ルールに厳密を保つ

  2. 実用的に: ほぼすべてのシステムで使用可能な 1 つのタイプのシェルに固有のものを作成します (マイクロコントローラーと SoC、または大きな鉄と sparc ステーションは数えません。bash はほとんどのシステムで使用できますが、bash を使用しないシステムがあるため、bash は使用されます)。 100% の移植性を実現するための最良の選択ではありませんが、絶対に最も (ab) 使用されています ;-)

  3. 最高の移植性: Ubuntu ユーザーの経験則として: ダッシュ (ubuntu の /bin/sh) で実行する場合、事実上すべてのもの (ルーター、トースター、コーヒーマシンを含む) で実行されます。

  4. とりわけ、user2719058は正しいです。OSX は Linux ではなく BSD-UNIX であるため、同じシェルを実行できますが、コマンドが異なるため、1 つのスクリプトですべてに対応することは非常に困難です。最適なシェルを選択してもそれは変わりません....したがって、すべてのシステムのシステム コマンドが POSIX に準拠していない限り、統一スクリプト言語の価値は非常に限定的であることがここで証明されています。

tl;dr:
統合されたクロスプラットフォーム スクリプティングは夢物語です。システム間のバイナリの違いがこれを妨げているからです。

于 2013-11-13T02:50:30.117 に答える