このプロジェクトについて

sh は、POSIX Shell、Bash、Zsh、mksh をサポートする純 Go で書かれたシェル パーサー、フォーマッター、インタープリターです。Go 1.26 以降が必要です。 プロジェクトは、3 つの主なパッケージに組織されています。syntax パッケージはシェル スクリプトを構文木に解析し、shfmt と同様の方法で検査とフォーマットを行うことを可能にします。shell パッケージは、シェル セマンティクスを持つ 1 回呼び出しヘルパーを提供します。コマンド ラインを引数に分割し、それらを引用して戻す (shlex に似ています)、文字列内の $VAR と ~ を展開し、** またはケース スタイル パターンを使用した globbing などです。interp パッケージは、システム シェルを使用せずにシェル スクリプトを実行します。Windows でも実行可能です。ハンドラーを使用すると、スクリプトが実行できることやアクセスできることをサンドボックス化できます。 shfmt は、プロジェクトで最も広く使用されている部分です。シェル プログラムをフォーマットし、`go install mvdan.cc/sh/v3/cmd/shfmt@latest` でインストールできます。典型的な使用方法は `shfmt -l -w script.sh` です。デフォルトのスタイルは、syntax/canonical.sh で示されており、man ページも提供されています。パッケージは、Alpine、Arch、Debian、Docker、Fedora、FreeBSD、Homebrew、MacPorts、NixOS、OpenSUSE、PyPI、Scoop、Snapcraft、Void、webi など、多くのチャンネルを通じて配布されています。Docker イメージは、リリース タグに対して公開され、`v3` が最新の安定版、`latest` が開発版となります。イメージには shfmt のみが含まれており、Alpine バリアントも利用可能です。 documented の注意事項には、次のものが含まれます。Bash の連想配列をインデックスするときは引用が必要です。静的なパーサーは、静的なパーサーは算術式とみなすためです。`$((` と `((` の曖昧さは、バックトラッキングがパーサーを複雑にし、io.Reader 経由でのストリーミングを妨げるため、サポートされていません。`export`、`let`、`declare` は、静的な構文ツリーを有効にし、`declare foo=(bar)` のような形式をサポートするために、キーワードとして解析されます。また、ライブラリは純 Go なので、インタープリターは POSIX シェルと Bash のセマンティクスを完全に一致させることができません。たとえば、サブシェルはフォークされたプロセスではなく goroutine を使用するため、実際の PID とファイル ディスクリプターは直接使用されません。 フォーマットの FAQ では、行範囲に対してフォーマットを無効にすることはできないこと、新しいフォーマット オプションは可能な限り避けられていること、一貫性は個々のスタイルの好みよりも優先されることが述べられています。 サードパーティの npm パッケージである sh-syntax には、パーサーとフォーマッターの WASM ビルドが含まれています。古い GopherJS ベースの mvdan-sh パッケージはアーカイブされています。エディターとツールの統合には、BashSupport-Pro、dockerfmt、intellij-shellscript、micro、neoformat、vscode-shfmt、shfmt.el、Trunk、modd、prettier-plugin-sh、sh-checker、mdformat-shfmt、pre-commit-shfmt、tesh などが含まれています。README では、ドライブバイ AI パッチは、貢献者がアクティブなユーザーまたは貢献者でない限り役に立たないと述べられており、詳細な問題ではなく代わりに詳細な問題を求めています。