GNU/Linux >> Linux の 問題 >  >> Linux

* shシェルのバッククォート(つまり、 `cmd`)は廃止されましたか?

このコメントは、UnixとLinuxだけでなく、BashやZshなどのシェルに関して、「バックティックは廃止されました」という表現を使用する他のサイトでも何度も見ました。

このステートメントは正しいですか、それとも間違っていますか?

承認された回答:

「非推奨」には2つの異なる意味があります。

非推奨: (主にソフトウェア機能)使用可能ですが、廃止されたと見なされ、通常は置き換えられたため、回避するのが最善です。

—新しいオックスフォードアメリカン辞書

この定義により、バックティックは 非推奨。

非推奨のステータス 機能が将来削除されることを示します。

—ウィキペディア

この定義では、バックティックはではありません 非推奨。

引き続きサポート:

シェルコマンド言語に関するOpenGroup仕様、特に「2.6.3コマンド置換」のセクションを引用すると、両方の形式のコマンド置換、バッククォート( `..cmd ..` > )またはドルパレン( $(.. cmd ..) )仕様が適用される限り、引き続きサポートされます。

抜粋

コマンド置換を使用すると、コマンドの出力をコマンド名自体の代わりに
置換できます。コマンド置換は、コマンドが次のように囲まれている場合に発生します。

          $(command)

          or (backquoted version):

          `command`

シェルは、
サブシェル環境(シェル実行環境を参照)でコマンドを実行し、
コマンド置換(コマンドのテキストとそれを囲む $()> または
バッククォート)コマンドの標準出力を使用して、置換の最後にある1つ以上の
文字のシーケンスを削除します。
出力の終わりの前に埋め込まれた文字は削除されません。ただし、
IFSの値と有効な引用符によっては、
フィールド区切り文字として扱われ、フィールド分割中に削除される場合があります。
出力に
ヌルバイトが含まれている場合、動作は指定されていません。

コマンド置換のバッククォートされたスタイル内で、
文字通りの意味を保持するものとします。ただし、「$」、「`」が続く場合を除きます。 ‘、または<バックスラッシュ> 。一致するバッククォートの
検索は、最初のクォートされていない
エスケープされていないバッククォートによって満たされるものとします。この検索中に、エスケープされていないバッククォートが
シェルコメント、ヒアドキュメント、埋め込みコマンド
$(command)の置換内で検出された場合 フォーム、または引用符で囲まれた文字列、未定義の結果
が発生します。 「`...`内の
開始するが終了しない一重引用符または二重引用符の文字列 」シーケンスは未定義の結果を生成します。

$(コマンド)を使用 フォームでは、開き括弧から一致する閉じ括弧に続くすべての文字がコマンドを構成します。コマンドには、有効なシェル
スクリプトを使用できます。ただし、
リダイレクトのみで構成され、不特定の結果が生じるスクリプトは除きます。

では、なぜバックティックは廃止されたと誰もが言うのですか?

ほとんどのユースケースはすべき バックティックの代わりにドルパレンフォームを利用している。 (上記の最初の意味では非推奨です。)最も評判の良いサイト(U&Lを含む)の多くは、全体を通してこれも同様に述べていることが多いので、適切なアドバイスです。このアドバイスを、シェルからバックティックのサポートを削除するという存在しない計画と混同しないでください。

  • BashFAQ#082 – `…`(バックティック)よりも$(…)が優先されるのはなぜですか?

    抜粋

    `...` は、POSIXと互換性のない最も古い
    ボーンシェルでのみ必要なレガシー構文です。常に
    $(...)を好む理由はいくつかあります 構文:

  • Bash Hackers Wiki –廃止され廃止された構文

    抜粋

    これは、コマンド置換の古いBourne互換形式です。
    両方の `COMMANDS` および$(COMMANDS) 構文はPOSIXで指定されていますが、
    後者は非常に 残念ながら前者はまだスクリプトで非常に普及していますが、推奨されます。新しいスタイルのコマンド置換は、すべての最新のシェル(および一部)によって広く
    実装されています。バックティックを使用する唯一の理由は、実際のBourneシェル(Heirloomなど)との互換性のためです。
    バックティックコマンドの置換では、ネストするときに特別なエスケープが必要です。
    実際に見られる例は、不適切に引用されています。多くの場合、そうではありません。参照:$(…)が `…`(バックティック)よりも優先されるのはなぜですか?。

  • POSIX標準の理論的根拠

    抜粋

    これらの一貫性のない動作のため、コマンド置換をネストしたり、複雑なスクリプトを埋め込もうとしたりする新しいアプリケーションには、バッククォートされたさまざまなコマンド置換はお勧めしません。

注: この3番目の抜粋(上記)は、バックティックが単純に機能しないいくつかの状況を示していますが、次の段落から始まる新しいドルパレンス方式は機能します。

さらに、バッククォートされた構文には、埋め込みコマンドの内容に歴史的な制限があります。新しい「$()」フォームはあらゆる種類の有効な埋め込みスクリプトを処理できますが、バッククォートされたフォームは、バッククォートを含む一部の有効なスクリプトを処理できません。

そのセクションを読み続けると、失敗が強調表示され、バックティックを使用して失敗する方法が示されますが、新しいドルの括弧表記を使用して機能します。

関連:コマンド(cmd)+オプション(alt)キーを押すために手を置く方法は?

結論

したがって、バックティックの代わりにドルパレンを使用することが望ましいですが、「これは計画された時点で完全に機能しなくなる」のように、技術的に「非推奨」になっているものを実際に使用しているわけではありません。

これをすべて読んだ後は、特にしない限り、ドルのパレンを使用することを強くお勧めします。 本物のオリジナルの非POSIXBourneシェルとの互換性が必要です。


Linux
  1. Aptパッケージによってインストールされたすべてのファイルを一覧表示するにはどうすればよいですか?

  2. 特定の日に変更されたすべてのファイルを取得しますか?

  3. ドル括弧の拡張をサポートせず、バックティックを要求するシェルはどれですか?

  1. 「?」を使用したコマンド置換

  2. タイプアヘッドをBash履歴検索(ctrl-r)に適用するにはどうすればよいですか?

  3. Linux コマンドに大文字を使用できますか?

  1. Linuxコマンドラインで牛を飼う

  2. さまざまなシェルでコマンドCoprocを使用する方法は?

  3. 異なるシェルでコマンド エイリアスを作成する例