シェルの機能比較詳細

AIページ
このページでは、Nushell、Bash、PowerShell、CMDなど各シェル環境の機能的な違いを詳しく比較します。 シェル環境の特徴の詳細版として、実際のコマンド例を交えて解説します。

パイプラインの違い

従来のシェルではテキストストリームをパイプでつなぎますが、Nushellでは構造化データをパイプでつなぎます。 これはPowerShellのオブジェクトパイプラインに近い概念ですが、さらに強力です。

パイプラインの違い
シェル コマンド例 説明
Bash ls -la | grep "\.txt$" | sort テキストベースのパイプライン(グレップで.txtファイルを抽出し、ソート)
PowerShell Get-ChildItem | Where-Object {$_.Name -like "*.txt"} | Sort-Object Length オブジェクトパイプライン(.txtファイルをフィルタリングし、サイズでソート)
Nushell ls | where name =~ "\.txt$" | sort-by size 構造化データのパイプライン(テーブルベースのフィルタリングとソート)
Rust (例) fd "\.txt$" | sort Rustツールを組み合わせたパイプライン処理

データ型とテーブル

Nushellでは、ほとんどのコマンド出力がテーブル形式になっています。 これにより、データベースのようなクエリが可能になります。

データ型とテーブル
シェル コマンド例 説明
Bash ps aux | awk '{print $2, $4, $11}' | sort -k2 テキスト処理でプロセスID、CPU使用率、コマンドを抽出しソート
PowerShell Get-Process | Select-Object Id, CPU, ProcessName | Sort-Object CPU オブジェクトのプロパティを選択してソート
Nushell ps | select pid cpu name | sort-by cpu テーブルから列を選択し、CPUでソート
Rust (例) procs | jaq -r '.[] | [.pid, .cpu, .name] | @tsv' | sort -k2 Rustツールを組み合わせたプロセス情報の処理

ファイル操作の違い

Nushellでは、構造化ファイル(JSON、YAML、CSVなど)をネイティブに扱えます。

ファイル操作の違い
シェル コマンド例 説明
Bash cat data.json | jq '.items[] | select(.price > 100)' jqを使ってJSONファイルからデータを抽出
PowerShell Get-Content data.json | ConvertFrom-Json | Where-Object {$_.price -gt 100} JSONをオブジェクトに変換してフィルタリング
Nushell open data.json | where price > 100 JSONファイルを直接開いてフィルタリング
Rust (例) cat data.json | jaq -r '.items[] | select(.price > 100)' Rust製jqクローン(jaq)を使用したJSON処理

変数と環境

変数の扱いもシェルによって大きく異なります。

変数と環境
シェル コマンド例 説明
Bash NAME="John"
echo "Hello, $NAME"
変数を設定し、展開する
CMD SET NAME=John
echo Hello, %NAME%
環境変数を設定し、参照する
PowerShell $NAME = "John"
Write-Host "Hello, $NAME"
変数を設定し、展開する
Nushell let name = "John"
echo $"Hello, ($name)"
let で変数を設定し、文字列補間で使用

シェル分割(Word Splitting)の問題

シェル分割は、特にBashなどの伝統的なシェルで変数を展開する際に発生する現象です。 変数内にスペースが含まれると、適切にクォートしない場合に予期しない動作が発生します。 以下に各シェルでの分割動作と対処法を示します。

シェル分割の取り扱い比較
シェル 問題のある例 正しい使い方 説明
Bash
FILES="file1.txt file2.txt"
rm $FILES  # 分割されて2つのファイルとして解釈
FILES="file1.txt file2.txt"
rm "$FILES"  # 1つの引数として扱われる
変数展開時にダブルクォートで囲まないと、スペースで分割されてしまう
CMD
SET FILES=file1.txt file2.txt
DEL %FILES%  # スペースが含まれると問題
SET "FILES=file1.txt file2.txt"
DEL "%FILES%"  # セットとアクセス両方でクォート
CMDではスペース含む変数は設定と使用時にクォートで囲む
PowerShell
$files = "file1.txt file2.txt"
Remove-Item $files  # 通常は問題なし
# スペースを含む複数ファイル
$files = "file1.txt", "file2.txt"
Remove-Item $files
PowerShellは自動分割しないが、複数アイテムを扱う場合は配列が推奨
Nushell
let files = "file1.txt file2.txt"
rm $files  # 文字列として扱われる
let files = ["file1.txt", "file2.txt"]
rm $files  # リストとして正しく扱われる
Nushellはタイプセーフなので、文字列は分割されない。複数アイテムはリストで表現

このようなシェル分割の違いは、異なるシェル間でスクリプトを移植する際に特に注意が必要です。 Bashでは二重引用符でくくらないと意図しない分割が発生しますが、PowerShellやNushellはより安全な変数展開を提供しています。

条件分岐とループ

制御構文もシェルによって異なります。

条件分岐とループ
シェル コマンド例(条件分岐)
Bash
if [ "$count" -gt 10 ]; then
  echo "Greater than 10"
else
  echo "Less than or equal to 10"
fi
CMD
IF %count% GTR 10 (
  echo Greater than 10
) ELSE (
  echo Less than or equal to 10
)
PowerShell
if ($count -gt 10) {
  Write-Host "Greater than 10"
} else {
  Write-Host "Less than or equal to 10"
}
Nushell
if $count > 10 {
  echo "Greater than 10"
} else {
  echo "Less than or equal to 10"
}

シェル環境の基本特徴 | Nushell移行ガイド