Bashで変数を入力するとき、declare
とtypeset
の違いは何ですか?関数内で使用する場合:declare
とtypeset
とlocal
の違いは何ですか?
私が遭遇した唯一の違いは、タイプセットがkshスクリプトに移植可能であることです。それ以外に、一方が他方よりも優先される理由はありますか?
更新:質問にlocal
を追加しました。
typeset
とdeclare
の違い:前者の方が移植性が高い(kshなど)が、移植性が問題にならない場合は後者がより好ましい。
declare
(またはtypeset
)とlocal
の違い:前者は後者を意味しますが、より強力です。たとえば、declare -i x
はx
にinteger
属性を持たせ、declare -r x
はx
を読み取り専用にするなどです。
Bashに関する限り、違いはありません。実際、マンページでは同じ定義を共有しています
[-aAfFilrtux] [-p] [name [= value] ...]を宣言します
typeset [-aAfFilrtux] [-p] [name [= value] ...]
変数を宣言するか、属性を指定します。名前が指定されていない場合は、変数の値を表示します。 -pオプションは、各名前の属性と値を表示します...
私はまた this little tidbit を見つけました。これは私の主張とあなたが述べたksh
移植性をさらに裏付けています。
宣言またはタイプセットのビルトインは正確な同義語であり、変数のプロパティを変更できます。これは、特定のプログラミング言語で利用できるタイピング[1]の非常に弱い形式です。 declareコマンドは、バージョン2以降のBashに固有です。 typesetコマンドは、kshスクリプトでも機能します。
セクション のBashマニュアルでは、4.2 Bash組み込みコマンド に次のように記載されています。
「タイプセット」
typeset [-afFrxi] [-p] [NAME [= VALUE] ...]
Kornシェルとの互換性のために、「typeset」コマンドが提供されています。ただし、「declare」組み込みコマンドのために非推奨になりました。