私は次のコマンドに出くわしました:
Sudo chown `id -u` /somedir
そして、私は疑問に思います:`
記号の意味は何ですか。たとえば、上記のコマンドは適切に機能しますが、以下のコマンドは機能しないことに気付きました。
Sudo chown 'id -u' /somedir
これは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。を使用して、バックスラッシュ(\
) その前に。
ここでもう少しポイントを追加したいと思います。
バックティック_`…`
_は、実際には コマンド置換 と呼ばれます。コマンド置換の目的は、バックティック内に配置されたコマンドを評価し、その結果を実際のコマンドの引数として提供することです。
コマンドの置換は、$(…)
を使用する方法と_`…`
_を使用する方法の2つの方法で実行できます。どちらも同じように機能しますが、$(…)
形式は最新の方法であり、より明確で読みやすくなっています。
など
_Sudo chown $(id -u) /somedir
_
他よりも優先することができます。
そして、ここでもう1つ注意する必要があるのは、bash document で言及されている bash quoting rules との コマンド置換 の関係です。
置換が二重引用符で囲まれている場合、結果に対してWordの分割とファイル名の展開は行われません。
ほとんど説明されていない明確化の注記:
バックティック(フランス語や他の言語で共通のアクセントとして使用されるため、グレーブスとも呼ばれます)は標準出力のみを置き換えますが、標準エラーは置き換えません。
したがって、前の例を続けるには:
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 :)
バックティック `は囲まれた文字列の内容を実行するので、このようなもの
file `which hostname`
ホスト名コマンドへのパスを見つけ、それがどのように構築されたかを教えてくれます。
質問に入力したコマンドはid -u
を実行して有効なユーザーIDを取得し、/ somedirの所有権をそのユーザーに変更します。
この記号は、その内部がそのコマンドの結果として解釈されることを意味します。
例えば:
$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three
上記の結果、three
ディレクトリが/home
ディレクトリにコピーされます。
バックティックはコマンド置換に似ています。このバッククォート構文は古風で、2つの括弧が付いたドル記号が一般的であることを知っています:$()
。
コマンド置換は、コマンドを実行し、その出力を後で使用できるように変数に格納するための専用の構文を使用した単一の操作です。
_thedate=$(date)
_
次に、結果を出力できます: '日付は%sです\ n' "$ thedate" `です。
$()
です。date
です。$(date)
が得られます。printf
の変数によって保持されている出力値を表示します。