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, alias
das 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, date
wird 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 . 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 echo "$(date)"
date
Befehl ausführen und die Ausgabe erfassen (alle nachfolgenden Zeilenumbrüche entfernen). Übergeben Sie dann die erfasste Ausgabe als Argument an den echo
Befehl, der sie zusammen mit einem einzelnen nachfolgenden Zeilenumbruch ausgibt. Es gibt überhaupt keinen Vorteil gegenüber der date
direkten Ausführung.
Allerdings hast du auch hier ein anderes Problem:
Wenn Sie den Alias festlegen d='$(date)'
, d
erhalten Sie beim Tippen das wörtliche Ergebnis der Eingabe $(date)
in die Befehlszeile – der date
Befehl 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 d
führen Sie aus, was Sie möchten.