コマンドで `(バッククォート/バックティック)はどういう意味ですか?


160

私は次のコマンドに出会いました:

sudo chown `id -u` /somedir

そして、私は疑問に思う:`シンボルの意味は何ですか。たとえば、上のコマンドはうまく機能しますが、下のコマンドはうまくいかないことに気付きました。

sudo chown 'id -u' /somedir

回答:


201

これはバックティックです。バックティックは引用符ではありません。それは非常に特別な意味を持っています。バックティックの間に入力するものはすべて(chown例のように)メインコマンドの前にシェルによって評価(実行)され、その実行の出力はそのコマンドで使用されます。コマンドライン。

だから何

sudo chown `id -u` /somedir

ユーザーIDに応じて)効果的に実行されます

sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

この質問を見て、多くの状況でバックティックを使用するのは良い考えではない理由を理解してください。

ところで、あなたは文字通り、バッククォートを使用したい場合は、たとえば、文字列では、あなたが(バックスラッシュを置くことによって、それを逃れることができ\、その前に)。


36
これはバックティックを非常によく説明します$(your expression)が、$()式をネストできるのと同じことを行うには、使用する方が良い方法です。たとえばcd $(dirname $(type -P touch))touch次のコマンドを含むディレクトリに移動します
Khaja Minhajuddin

11
@KhajaMinhajuddinあなたは間違いなくネストについて正しいです- 上記の質問はそれを詳細にカバーしています。しかし$()、ほとんどの状況で使用するのは良い習慣だと思いますが、逆流を悪化させることはありません。実際には、コマンドラインでの入力がはるかに高速であることを認める必要があります(少なくとも5回と比較して2回のキーストロークを含むShift)。
rozcietrzewiacz

2
@rozcietrzewiacz後者のコメントはほとんどのキーボードに当てはまります$( )` `、少なくともフランス語キーボードよりも間違いなく入力しやすいでしょう。
jlliagre

1
@KhajaMinhajuddinバックティックをネストすることはできますが、2レベルのバックティックをエスケープする必要があり、2レベルのネストには3つのバックティック、3レベルのネスト5つのバックティック、4番目のレベル7、&cが必要です。
JustinCB

66

ここにもう少しポイントを追加したいと思います。

バックティック`…`は実際にはコマンド置換と呼ばれます。コマンド置換の目的は、バックティック内に配置されたコマンドを評価し、その結果を実際のコマンドの引数として提供することです。

コマンド置換は、1が使用している2つの方法で行うことができ$(…)、他方があります`…`。どちらも同じように機能しますが、$(…)フォームは最新の方法であり、より明確で読みやすくなっています。

など

sudo chown $(id -u) /somedir

他に優先することができます。

そして、ここで注意する必要があるもう1つのことは、bash 文書で言及されているbashの引用規則とのコマンド置換関係です。

置換が二重引用符で囲まれている場合、結果に対して単語の分割とファイル名の展開は実行されません。


8
また、$(...)より良くネストします。
クサラナナンダ

$()そして、"``"同じように動作しません
くん

10

明確化に関する1つのメモはめったにカバーされません。

バックティック(フランス語や他の言語で共通のアクセントとしても機能するためGravesと呼ばれることもあります)は、標準出力のみを置き換えますが、標準エラーは置き換えません。

したがって、前の例を続けるには:

file `which hostname`

期待どおりに動作しますが、次の場合:

file `which hostnameX`

whichはエラーを返し、その出力は、file;の隣のコマンドラインに代入するのではなく、標準エラーになります。次のコマンドを実行して確認できる標準出力はまったくありません。

which hostnameX

which hostnameX 2>/dev/null

この場合、

file `which hostnameX` 

2つのエラーメッセージを生成します(1つwhich hostnameX目はファイル名によるものであり、2つ目は前者の直後であり、ファイル自体によるものであり、ファイル名がないことを検出するため、コマンド全体

基本的には次のようになります。

file

もちろん、これは不適切な使用であり、使用エラーを返します。

(自分で確認したい場合は、以下を試してください:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)

4

バックティック `は、囲まれた文字列の内容を実行するため、次のようになります

file `which hostname`

hostnameコマンドへのパスを見つけて、それがどのように構築されたかを教えてくれます。

質問に入力したコマンドが実行されてid -u有効なユーザーIDが取得され、/ somedirの所有権がそのユーザーに変更されます。


2

この記号は、その中にあるものがそのコマンドの結果として解釈されることを意味します。

例えば:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

上記の結果、threeディレクトリが自分の/homeディレクトリにコピーされます。


1

バッククォートはコマンド置換に似ています。このバックティックの構文は古風であり、2つの括弧を持つドル記号が一般的であることを知っています$()

コマンド置換とは何ですか?

コマンド置換は、コマンドを実行し、その出力を後で使用するために変数に保存するための専用の構文を持つ単一の操作です。

日付付きの例:

thedate=$(date)

次に、結果を出力できます: '日付は%s \ n' "$ thedate" `です。

  1. コマンド置換構文は$()です。
  2. コマンド自体はdateです。
  3. 両方を組み合わせると、$(date)その出力が置換であることがわかります。
  4. printf上記のコマンドごとに、変数で保持されている出力値を表示します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.