エイリアスの単一引用符内のコマンド置換

エイリアスの単一引用符内のコマンド置換

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、コマンドはそれを末尾の改行 1 つとともに印刷します。直接実行するだけの場合と比べて、まったく利点はありません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必要なものを実行します。

関連情報