SC2006: バッククォートのコマンド置換を$()に置き換え

非推奨のバッククォート`command`からモダンな$(command)構文への移行。読みやすさ、ネスト、エスケープの面で$()が推奨される理由を解説します。

Deprecated Syntax

詳細な説明

バッククォート vs $() コマンド置換

バッククォートのコマンド置換(`command`)はオリジナルのPOSIX構文ですが、$(command)がモダンで推奨される形式です。バッククォートはまだ動作しますが、いくつかの実用的な問題があります。

$()が優れている理由

1. ネストがクリーン:

# $(): 読みやすいネスト
echo "Version: $(cat $(find /opt -name version.txt -print -quit))"

# バッククォート: エスケープが必要
echo "Version: \`cat \\\`find /opt -name version.txt -print -quit\\\`\`"

2. 一貫したバックスラッシュ処理:

# $()はバックスラッシュをそのまま保持
echo $(echo "path\\to\\file")  # 出力: path\to\file

# バッククォートは1レベルのバックスラッシュエスケープを消費
echo \`echo "path\\\\to\\\\file"\`  # ダブルエスケープが必要

3. 視覚的な明確さ:

# $()で境界が見やすい
result=$(long_command --with-many "arguments" | filter)

# バッククォートは一部のフォントでシングルクォートと混同される
result=\`long_command --with-many "arguments" | filter\`

移行例

# 変更前(バッククォート)
DATE=\`date +%Y-%m-%d\`
FILES=\`find . -name "*.log"\`
COUNT=\`wc -l < "$file"\`

# 変更後($())
DATE=$(date +%Y-%m-%d)
FILES=$(find . -name "*.log")
COUNT=$(wc -l < "$file")

POSIX互換性

両形式ともPOSIXで定義されています。$()はPOSIX.1-2001で追加され、dash、ash、busybox shを含むすべてのモダンシェルでサポートされています。バッククォートを好むポータビリティ上の理由はありません。

ユースケース

レガシーシェルスクリプトのモダナイズ、チームでの一貫したコーディング標準の適用、読みやすく保守しやすい新しいスクリプトの作成。特に古い自動化スクリプトのリファクタリング時に関連します。

試してみる — Shell Script Linter

フルツールを開く