Befehlsersetzung in einfachen Anführungszeichen für Alias

Befehlsersetzung in einfachen Anführungszeichen für Alias

Zur Befehlsersetzung sind in Bash doppelte Anführungszeichen erforderlich:

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

Während einfache Anführungszeichen keine Befehlsersetzung durchführen:

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

… warum sehe ich dann das folgende Verhalten, aliasdas darauf schließen lässt, dass die Befehlsersetzung mit einfachen Anführungszeichen erfolgte?

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

Antwort1

Versionen mit einfachen Anführungszeichen vs. Versionen mit doppelten Anführungszeichen

Definieren wir den Alias ​​in einfachen Anführungszeichen:

$ alias d='$(date)'

Lassen Sie uns nun die Definition des Alias ​​abrufen:

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

Beachten Sie, dass noch keine Befehlsersetzung durchgeführt wurde.

Machen wir dasselbe, aber dieses Mal mit Anführungszeichen:

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

Da doppelte Anführungszeichen verwendet werden, wurde die Befehlsersetzung durchgeführt, bevor der Alias ​​definiert wurde.

Version mit einfachen Anführungszeichen

Versuchen wir, die Version mit einfachen Anführungszeichen auszuführen:

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

Die Version in einfachen Anführungszeichen entspricht dem folgenden Befehl:

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

In beiden Fällen wird die Befehlsersetzung durchgeführt, wenn der Befehl ausgeführt wird.

Eine Variation

Betrachten wir diesen Alias, der Befehlsersetzung verwendet und mit einfachen Anführungszeichen definiert ist:

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

Jedes Mal, wenn wir diesen Befehl ausführen, datewird er erneut ausgewertet. Mit einfachen Anführungszeichen wird die Befehlsersetzung ausgeführt, wenn der Alias ​​ausgeführt wird, und nicht, wenn er definiert wird.

Antwort2

Wenn Sie bei der Definition eines Alias ​​doppelte Anführungszeichen verwenden, erfolgt die Parametererweiterung an derAliasdefinitionZeit.

Zum Beispiel:

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

Wenn Sie möchten, dass die Parametererweiterung zu dem Zeitpunkt erfolgt,Anrufder Alias, verwenden Sie einfache Anführungszeichen, wenn Sie den Alias ​​definieren:

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

Natürlich gibt es niebeliebigGrund, den Befehl auszuführen echo "$(date)". Ich weiß, dass Sie dies nur als Beispiel verwendet haben, aber da ich dies schon so oft „in freier Wildbahn“ gesehen habe, werde ich es trotzdem klarstellen: Das bedeutet, dass Sie den dateBefehl ausführen und die Ausgabe erfassen (alle nachfolgenden Zeilenumbrüche entfernen). Übergeben Sie dann die erfasste Ausgabe als Argument an den echoBefehl, der sie zusammen mit einem einzelnen nachfolgenden Zeilenumbruch ausgibt. Es gibt überhaupt keinen Vorteil gegenüber der datedirekten Ausführung.

Allerdings hast du auch hier ein anderes Problem:

Wenn Sie den Alias ​​festlegen d='$(date)', derhalten Sie beim Tippen das wörtliche Ergebnis der Eingabe $(date)in die Befehlszeile – der dateBefehl wird ausgeführt, die Ausgabe erfasst, das nachfolgende Newline-Zeichen wird entfernt und die Ausgabe wird anschließend von der Shell als Befehl analysiert (einschließlich Worttrennung und Datei-Glob-Erweiterung).

Da heute Freitag ist, ist das erste ausgegebene Wort date„Fri“, daher versucht die Shell, dies als Befehl auszuführen.

Wenn Sie möchtensehendas Datum, wenn Sie eingeben d, verwenden Sie einfach:

alias d=date

oder

alias d='date'

oder

alias d="date"

Es spielt keine Rolle, welche Form Sie verwenden, da es keine Sonderzeichen gibt, die Anführungszeichen erfordern.

Antwort3

Geht es um ~/.bashrc? Es gibt einen kommentierten Teil in der~/.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.   

und deshalb verwende ich für meine Verknüpfungen eine andere, vorgeschlagene Datei:

Die~/.bash_aliases

Der Schlüssel besteht darin, das einfache Anführungszeichen zu umgehen:

# 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"'

Öffnen Sie dann eine neue Terminalsitzung und dführen Sie aus, was Sie möchten.

verwandte Informationen