一重引用符内のコマンドの代替エイリアス

一重引用符内のコマンドの代替エイリアス

Bashでは、コマンドの置き換えに二重引用符を使用する必要があります。

$ echo "$(date)"
Fri Oct 28 19:16:40 EDT 2016

一重引用符はコマンド置換を実行しません。

$ echo '$(date)'
$(date)

alias...それでは、一重引用符でコマンド置換が発生していることを示す次の動作が表示されるのはなぜですか?

alias d='$(date)'
$ d
No command 'Fri' found, did you mean:
   ....

答え1

一重引用符と二重引用符のバージョン

一重引用符を使用してエイリアスを定義しましょう。

$ alias d='$(date)'

それでは、エイリアスの定義を検索してみましょう。

$ alias d
alias d='$(date)'

まだコマンド置換は行われていません。

同じことをしましょう。ただし、今回は二重引用符を使用します。

$ alias d="$(date)"
$ alias d
alias d='Fri Oct 28 17:01:12 PDT 2016'

二重引用符を使用するため、エイリアスが定義される前にコマンド置換が実行されます。

一重引用符のバージョン

一重引用符のバージョンを実行してみましょう。

$ alias d='$(date)'
$ d
bash: Fri: command not found

一重引用符のバージョンは、以下を実行するのと同じです。

$ $(date)
bash: Fri: command not found

どちらの場合も、コマンドの実行時にコマンド置換が実行されます。

変種

コマンド置換と一重引用符を使用して定義されたこのエイリアスを考えてみましょう。

$ alias e='echo $(date)'
$ e
Fri Oct 28 17:05:29 PDT 2016
$ e
Fri Oct 28 17:05:35 PDT 2016

このコマンドを実行するたびにdate再評価されます。一重引用符を使用すると、エイリアスが定義されるのではなく、エイリアスが実行されたときにコマンド置換が実行されます。

答え2

エイリアスを定義するときに二重引用符を使用すると、次のパラメータ拡張が発生します。エイリアスの定義時間。

たとえば、

$ pwd
/tmp
$ echo $PWD
/tmp
$ alias p="echo $PWD"
$ p
/tmp
$ cd /
$ pwd
/
$ p
/tmp
$ alias p
alias p='echo /tmp'
$ 

パラメータ拡張が必要な​​場合呼ぶエイリアスとエイリアスを定義するときは、単一​​引用符を使用してください。

$ alias p='echo $PWD'
$ p
/tmp
$ cd /
$ p
/
$ 

もちろん絶対にどのこのコマンドを実行する理由ですecho "$(date)"。私はこれを単に例として使用していることを知っていますが、これを「野生で」何度も見たので、とにかく明確に説明します。これが何を意味するのかをコマンドを実行し、出力をキャプチャしますdate(末尾の改行を削除)。 。キャプチャされた出力は、echo単一の末尾の改行で印刷するコマンドに引数として渡されます。直接実行するよりも利点はありませんdate

しかし、ここには他の問題もあります。

エイリアスを設定した後にd='$(date)'入力すると、コマンドラインに入力したテキストの結果が得られますd。コマンドが実行され、出力がキャプチャされ、末尾の改行が削除され、次に出力が解析されます。コマンドシェル(トークン化とファイルグローバル拡張を含む)$(date)date

今日は金曜日なので、最初の単語出力dateは「Fri」なので、シェルはそれをコマンドとして実行しようとします。

欲しいものがあればバラより日付を入力するにはd

alias d=date

または

alias d='date'

または

alias d="date"

特殊文字は引用形式を必要としないため、どの形式を使用するかは問題ではありません。

答え3

そんなことが起きていますか~/.bashrc?内部にコメントセクションがあります。~/.bashrc

    95 # Alias definitions.                                              
    96 # You may want to put all your additions into a separate file like
    97 # ~/.bash_aliases, instead of adding them here directly.          
    98 # See /usr/share/doc/bash-doc/examples in the bash-doc package.   

これが他の推奨ファイルをショートカットとして使用する理由です。

これ~/.bash_aliases

鍵は一重引用符をエスケープすることです。

# I use vim but nano or gedit is also fine
vim ~/.bashrc # or vim ~/.bash_aliases
# create your alias:
alias d=''\'date''\'
# or
alias dd="'date'"
# or
alias ddd='"date"'

次に、新しいターミナルセッションを開き、目的のdタスクを実行します。

関連情報