Ich habe ein Git-Befehl, Ich mag würde in meinem Skript auszuführen:Bash: Wie man Befehl ausführt, der Anführungszeichen erwartet, die eine Variable verwenden?
git filter-branch -f --env-filter "STUFF HERE IN QUOTES"
Die Sache ist, die ich in meinem Skript dynamisch die Zeichenfolge erschaffe, die von STUFF HERE IN QUOTES
dargestellt wird:
ENVFILTER=""
while read commit; do
IFS="|" read date hash message <<< "$commit"
DATE_NO_SPACE="$(echo "${date}" | tr -d '[[:space:]]')"
COMMIT_ENV=$(cat <<-END
if [ \$GIT_COMMIT = $hash ]
then
export GIT_AUTHOR_DATE="$DATE_NO_SPACE"
export GIT_COMMITTER_DATE="$DATE_NO_SPACE"
fi
END
)
ENVFILTER="$ENVFILTER$COMMIT_ENV"
done < $tmpfile
git filter-branch -f --env-filter \'"$ENVFILTER"\' // <---------- does not work
Im Grunde beginne ich mit einer leeren Zeichenkette ENVFILTER
und concat mit anderen Strings, um eine Menge von if-Anweisungen zu bilden. Ich habe Probleme mit dem letzten Schritt, der den eigentlichen Befehl ausführt. Ich weiß nicht, wie ich es mit den erwarteten Anführungszeichen und dem interpolierten Wert ausführen soll.
=== UPDATE ===
Nach einem Blick auf @ chepner Antwort und mit "$ENVFILTER"
, kann ich jetzt erfolgreich den Befehl ausführen. Also ist die Antwort richtig.
Allerdings gibt es ein Fehler zu meinen if
Aussagen (nicht auf die Zitate bezogen):
Rewrite eeb8860c13179c931a513a9ada76dc109324d790 (1/17)/opt/boxen/homebrew/Cellar/git/2.6.2/libexec/git-core/git-filter-branch: eval: line 313: syntax error near unexpected token `if'
/opt/boxen/homebrew/Cellar/git/2.6.2/libexec/git-core/git-filter-branch: eval: line 313: ` fi if [ $GIT_COMMIT = 08a2d85f9412c67435929d80ccc5b914f3ad8547 ]'
env filter failed: if [ $GIT_COMMIT = 59d13c174c34b6540f61585ef507abcef29ab22e ]
then
export GIT_AUTHOR_DATE="2016-10-02T21:16:37-04:00"
export GIT_COMMITTER_DATE="2016-10-02T21:16:37-04:00"
fi if [ $GIT_COMMIT = 08a2d85f9412c67435929d80ccc5b914f3ad8547 ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:54:28-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:54:28-04:00"
fi if [ $GIT_COMMIT = d7801396f5fb1092beec3aa484361cd50ab35e9e ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:53:07-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:53:07-04:00"
fi if [ $GIT_COMMIT = 7930e9be149a57229c9fc26ccffe1c6453317d70 ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:48:03-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:48:03-04:00"
fi if [ $GIT_COMMIT = f0849b2de99ac37790eaf6e40c8980988e865c7c ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:46:33-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:46:33-04:00"
fi
[
Gibt es etwas falsch mit ihm? Ich verstehe es nicht
Der Befehl * nicht * eigentlich erwarten, dass wörtliche Zitate. Wenn in der Dokumentation Anführungszeichen stehen, sind dies * syntaktische * Anführungszeichen, die * an die Shell *, nicht an 'git', andeuten, der Inhalt sollte als einzelnes Argument übergeben werden; Dieses Argument, das von der Shell im Array "argv" übergeben wird, enthält nur literalen Inhalt. Die Syntax wird während der Verarbeitung der Shell entfernt. –
Sieht so aus, als hätten Sie das '' '' nicht in die Anführungszeichen gesetzt, wie es in der Antwort von chepner war? –
ooo ist das erforderlich? so wie dieses 'wenn ...; dann ...; fi; ' – Edmund