Wiederverwenden ähnlicher Flags für mehrere Befehle

Wiederverwenden ähnlicher Flags für mehrere Befehle

Angenommen, ich möchte mehrere Befehle mit ähnlichen Flags ausführen, wie etwa:

du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4

Ich möchte die --excludeFlag-Sequenz wiederverwenden und den Code übersichtlicher gestalten, indem ich diese Flags beispielsweise in einer Variablen speichere.

Die obigen Befehle sehen also folgendermaßen aus:

du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"

Beachten Sie, dass tarDateien und Verzeichnisse relativ zum angegebenen Verzeichnis ausgeschlossen sind.

Was ist die beste und sauberste Lösung?

Hintergrund

Ich möchte mein System mit Tar sichern und einige Verzeichnisse ausschließen, die ich nicht benötige.

Antwort1

Sie können Folgendes versuchen:

$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4

Hier verwenden wir bashdie Verlaufserweiterung:

  • !!siehe den letzten Befehl
  • 3-$siehe 3. Parameter bis zum letzten

bashSie sollten in Ihrem Skript die Funktionen zur Verlaufserweiterung aktivieren , die in der nicht interaktiven Shell deaktiviert sind:

set -o history
set -o histexpand

Antwort2

In Bash besteht eine sehr saubere Möglichkeit darin, Arrays zu verwenden:

myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"

Sie können mit Leerzeichen und anderen lustigen Zeichen umgehen:

myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"

Sie können auch gefälscht sein, wenn Sie beispielsweise alle Unterverzeichnisse des Verzeichnisses ausschließen möchten /this/one, die den Buchstaben enthalten g:

exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"

Antwort3

Ich hätte dies als Kommentar hinzugefügt, aber ich habe noch nicht herausgefunden, wie man Kommentare gut formatiert!

Wie dem auch sei, ich glaube, Sie haben 90 % des Weges geschafft. Versuchen Sie:-

EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS

Anführungszeichen sind in der ersten Zeile erforderlich, da diese Leerzeichen enthält.

Keine Anführungszeichen bei Verwendung der Variablen, sodass die Argumente bei Leerzeichen getrennt werden.

Wenn die ausgeschlossenen Verzeichnisnamen Leerzeichen enthalten, müssen Sie diese maskieren.

verwandte Informationen