web-dev-qa-db-ja.com

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

私は次のコマンドに出くわしました:

Sudo chown `id -u` /somedir

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

Sudo chown 'id -u' /somedir
189
gws

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

だから何

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

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

ところで、文字列でバックティックを文字列で使用したい場合はe.g。を使用して、バックスラッシュ(\) その前に。

231
rozcietrzewiacz

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

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

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

など

_Sudo chown $(id -u) /somedir
_

他よりも優先することができます。

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

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

73
Kannan Mohan

ほとんど説明されていない明確化の注記:

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

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

file `which hostname`

期待どおりに動作しますが、

file `which hostnameX`

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

which hostnameX

which hostnameX 2>/dev/null

この場合、

file `which hostnameX` 

twoエラーメッセージ(最初のメッセージは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 :)
10
Dave K

バックティック `は囲まれた文字列の内容を実行するので、このようなもの

file `which hostname`

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

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

4
Julian

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

例えば:

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

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

2
Hanan N.

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

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

コマンド置換は、コマンドを実行し、その出力を後で使用できるように変数に格納するための専用の構文を使用した単一の操作です。

日付の例:

_thedate=$(date)
_

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

  1. コマンド置換構文は$()です。
  2. コマンド自体はdateです。
  3. 両方を組み合わせると、出力が置換である$(date)が得られます。
  4. 上記のコマンドに従って、printfの変数によって保持されている出力値を表示します。
1
user9303970