bashスクリプトの代わりにzshを使用することをお勧めしますか?[閉まっている]


25

zshスクリプトを実行するのに十分な人がインストールされていると仮定できますか?

#!/usr/bin/env zsh

シバンとして?

または、これにより、スクリプトが非常に多くのシステムで実行できなくなりますか?

明確化:エンドユーザーが実行したいプログラム/スクリプトに興味があります(Ubuntu、Debian、SUSE、Arch&cなど)。


4
奇妙な質問。あなたのターゲットは誰ですか?特定のサークル(Ruby-on-RailsのWeb開発者)ではzsh人気があるかもしれませんが、他のサークル(銀行セクター)ではほとんど前代未聞です。これに関する適切なアドバイスが必要な場合は、もっと多くの情報を提供する必要があると思います。
ラーム

一般的なLinuxエンドユーザーの世界。
-Profpatsch

2
WRT「一般的なLinuxエンドユーザーの世界」、zshは非標準です。デフォルトでは(ほとんどまたはすべてのディストリビューションに)インストールされていないか、何も必要としないため、ほとんどの人はインストールしません。
goldilocks

3
私は持っていないzsh上にインストール任意の私のシステムの、そして私は、単一のスクリプトのためにそれをインストールしないでしょう。bashが通常利用可能であるとしても、bashismsを避けるべきです。
frostschutz

回答:


29

移植性のために、いいえ。しばらくは、zshCygwinのを経由して、少なくともいずれかのUnixやUnixライクなとさえWindows上でコンパイルすることができ、ほとんどのオープンソースのUnix-好きで、いくつかの商業的なもののためにパッケージ化され、それは一般的にデフォルトのインストールには含まれていません。

bashもう一方の端はbash、大部分の非組み込みLinuxベースのシステムのように(時にはGNUプロジェクトのシェルのように)GNUシステムにインストールされ、Apple OS / Xのような非GNUシステムにもインストールされます。商用Unixの側では、Kornシェルは、(AT&Tバリアント、もっといえksh881)規範であるとの両方bashzshオプションパッケージです。BSD系では、好適な対話型シェルが多いtcshながらshAlmquistシェルまたはいずれかに基づいているpdkshbashか、zshだけでなく、オプションパッケージとしてインストールする必要があります。

zshApple OS / Xにデフォルトでインストールされます。以前は/bin/shそこにいたことさえありました。デフォルトでは、SysRescCD、Grml、GobolinuxなどのいくつかのLinuxディストリビューションで見つけることができますが、主要なディストリビューションはないと思います。

のようにbash、インストールされたバージョンの問題があり、結果として利用可能な機能があります。たとえば、bash3またはでシステムを見つけることは珍しくありませんzsh3。また、保証はありませんためにあなたが今書くことをスクリプトことzsh5で動作しますzsh6のためのようにかかわらずbash、彼らは下位互換性を維持しようとします。

スクリプトについては、私の見解は次のとおりです。すべてのUnicesには、その構文を解釈できるsh(必ずしもである必要はありません/bin)というシェルが少なくとも1つあるため、POSIXシェル構文を使用します。そうすれば、移植性についてそれほど心配する必要はありません。そして、その構文があなたのニーズに十分でないなら、おそらくあなたはシェル以上のものを必要とします。

次に、オプションは次のとおりです。

  • 遍在するPerl
  • スクリプトの依存関係として、依存関係を指定するターゲットシステムごとにパッケージを構築するか、それを規定することにより、インタープリターとそのバージョン(python 2.6以上、zsh 4以上、bash 4.2以上)を指定します。スクリプトと一緒に出荷されるREADMEファイル、またはスクリプトの上部にコメントとして埋め込まれるか、またはスクリプトの先頭にBourne構文の数行を追加して、要求されたインタープリターの可用性を確認し、明示的なエラーで終了するそうでない場合は、このスクリプトのようにzsh 4.0以上が必要です。
  • スクリプトと一緒にインタープリターを出荷します(ライセンスへの影響に注意してください)。つまり、ターゲットOSごとに1つのパッケージも必要です。一部のインタープリターは、スクリプトとそのインタープリターを単一の実行可能ファイルにパックする方法を提供することにより、それを容易にします。
  • コンパイルされた言語で書きます。繰り返しますが、ターゲットシステムごとに1つのパッケージです。

「zsh-man」「no」と言って、私はあなたを誇りに思っています!^^移植性ftw!(すべての警告を...)。+1。
オリビエデュラック

9

いいえ、あなたがすることはできません。保証されているのは/bin/sh、本質的には元のBourneシェルです。ほとんどすべて(「ほぼ」に注意してください!)Linuxインストールにはbashがありますが、* BSDシステムではめったにありません(bashのようなGPLコードについてのBSDの認識に深刻な不安があります)。Macで標準シェルが何であるかはわかりませんが、GPLについては不安があります。Solarisでも同じです。

zshはニッチなシェルであり、Fedoraのデフォルトのインストールには含まれていません(また、主要なディストリビューションのデフォルトではないと思います)。


6
確かに元のBourne Shellではなく、Posix準拠システムのPosixシェルは、多くのシステムでは/ bin / shですが、必ずしもそうではありません(Solaris <=バージョン10では/ usr / xpg4 / bin / sh)
検査官

まあ、「デフォルト」のインストールは本当に重要ではありません。重要なのは、インストールされているかどうかです。
-Profpatsch

@Profpatsch、デフォルトのインストールは非常に重要です(おそらく、ディストリビューションが実際に使用するものを決定します)。
フォンブランド

2
@StephaneChazelas、「ニッチ」は「少数のユーザーがそれを使用する」/「少数のインストールで使用される」など。スライスされたパン以来の最高のシェルかもしれませんが、ごく一部しか使用しない場合、どこにでもインストールされるとは考えられません。
フォンブランド

1
現在、Linux展開の大部分が埋め込まれている(Android、プリンター、ルーター、テレビ、電球など)と考えている場合、Linuxベースのシステムの大部分にはないことに注意してくださいbash(これらのシステムはおそらくメインではありませが) OPが彼の質問に念頭に置いていたターゲット)
ステファンシャゼラス

2

使用しているzshの追加機能と場所によって本当に異なると思います。さまざまなユーザーやシステムにスクリプトを配布する場合は、bashまたはshを使用することをお勧めします。

スクリプトが組織全体で実行されるように設計されており、マシン上でzshを使用する規則がある場合(たとえば、同じ基本AMI)、タスクに高度なファイルセレクターやhttp:/からの他のものなどの明確な利点がある場合/www.rayninfo.co.uk/tips/zshtips.html先に進んでください!


1

前述のように、bash多くのディストリビューションのデフォルトのインストールで一般的に利用可能です。あなたのスクリプトはに依存することで最大のユーザーベースに到達しませんzsh

スクリプトを設計する前に答えるべき重要な質問は、「スクリプトを実行するシェルが重要なのはなぜですか?です

異なるシェルは異なる構文を使用するか、他のシェルではサポートされない追加のシェル機能を提供します。「一般的なLinuxエンドユーザーワールド」用のスクリプトを作成するには、スクリプトが特定のシェル環境に依存する構文またはシェル関数を使用しているかどうかを判断します。

たとえば、bashシェルdash、、Bourneシェル、または/bin/shユーザーのシステム上のどのポイントでもサポートされていない特定の拡張をサポートします。

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

echo {1..10}/bin/sh比較して実行すると、/bin/bash非常に異なる出力が得られます。

同じことは、zshほとんどのbash構文をサポートしながら、bashシェルでサポートされていない追加の拡張と構文を提供します。特定の例については、シェル比較するこの表を参照してください。

bash呼び出され#!/bin/sh -uたときに機能するスクリプトに従うことで、潜在的なユーザーベースを広げることができます。ただし、これにより、「移植性の向上と引き換えに何が犠牲にされていますか?

セキュリティ上の懸念、機能、効率性、またはスクリプトの優先事項であると感じる他の何かに関連する違いを犠牲にする価値があるかどうかを判断します。より多くの環境で機能するという理由だけで、既知のセキュリティ脆弱性を持つスクリプトを広く使用したくない場合があります。

コマンドシェルを比較するbash際の基準として、これらのスクリプトのサポートが使用されるため、多くのスクリプトが記述されています。スクリプトに依存する場合やシェル環境専用の他の構文よりも多くの人がスクリプトを実行できます。zsh

また、ユーザーがスクリプトを実行する方法を最終的に制御できないことに注意してください(異なるシェルでのスクリプトのデバッグにも役立ちます)。

シェルを使用してシェルスクリプト(「sh scriptname」)を読み取る場合、直接実行するのではなく(「./scriptname」)、シェルはシェルスクリプトの先頭にあるすべてのコメントをコメントとして扱うことに注意してください。特に、スクリプトの実行時に使用するインタープリターを指定するコメント(「#!/ bin / sh -u」)は無視され、そのインタープリターの横にリストされているすべてのオプションも無視されます。

そのため、スクリプトの移植性を高めることは、スクリプトが機能する方法に大きな犠牲がない限り実行できます。

また、Bashのコーディング規約-Stack Overflowも参照できます。


1
「犠牲にされているもの」... autoconfを見てください。「オリジナルのボーンシェル」のように/ bin / shをターゲットにしました。これは、すべてのシェルがその(小さな)機能セットをサポートしているためです。そして、彼らはそれのために大いに苦しみました。
ユルゲンA.エアハルト

1

あなたがほとんど保証できる唯一の事はあることです/bin/sh。これは、実際には静的にリンクされたシェルである場合もあれば、別のシェルへのリンクである場合もあります。他のシェルは通常、shとして呼び出され、互換モードで実行されることを検出します。

ほぼ最初の文に注目してください。

私が今まで取り組んだシステムのようなすべてのUNIXにはそれがありました。それらの多くにはbashもインストールされています(ただし、すべてではありません。bashは一部のBSDにはデフォルトでインストールされていません。一部のLinuxディストリビューションには、Debian AlmquistシェルであるDASHが含まれています)。

保証できるのはインストール手順です。zshが必要であることを示す行をREADMEファイルに追加できます。パッケージをビルドすると、zshを依存関係としてマークできます。autoconf / automakeツールで確認できます。インストールスクリプトでzshが見つかったかどうかを確認できます(/ bin / shで開始し、見つかった場合はzshを見つけてください。エラーが表示されない場合。例:「警告:ZSHがインストールされていません。インストール手順ファイルを読んでください! "。)

私はもういくつかのオプションを忘れたと確信しています。しかし、重要な点は次のとおりです。

  • チェックするまで何も保証できません。
  • / bin / shが存在することと、それを確認することがほぼ確実にできます。

POSIXには/ bin / sh、AFAIUが必要です。同様に、いくつかの他の合理的なユーティリティが必要です。GNU自動没収の要件を確認してください。
フォンブランド

@vonbrand。POSIXには必要ありません/bin/shsh正しい環境(既定の環境である必要はありません)で指定されたとおりに動作するが必要です。/bin/shPOSIXシェルではない場合があります。たとえば、Solaris 10以前では、まだBourneシェルであり、標準shはでした/usr/xpg4/bin
ステファンシャゼル14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.