Gibt es eine elegante Möglichkeit, eine Shell-Variable auf den Inhalt einer Datei festzulegen?

11

Angenommen, ich habe einige Konfigurationsdaten in einer Datei config. Der Einfachheit halber möchte ich diese Daten in eine Shell-Variable laden CONFIG_DATA.

Natürlich kann ich:

CONFIG_DATA="$(cat config)"

Aber das fühlt sich für mich irgendwie nutzloscat an. Ist dies der einzige Weg, dies zu tun? Oder gibt es einen eleganteren Weg, dies zu tun?

Antworten sollten POSIX bevorzugen, können aber jede Shell verwenden.

strugee
quelle
2
Das Lesen einer ganzen Datei im Speicher wie diesem ist fast immer eine schlechte Idee, unabhängig davon, wie Sie sie schreiben.
Satō Katsura
2
@SatoKatsura in einigen Fällen sehr wahr. Für die Zwecke dieser Frage können Sie jedoch davon ausgehen, dass die Datei sehr klein ist, sodass dies kein großes Problem darstellt.
Strugee
1
@SatoKatsura: warum?
RemcoGerlich

Antworten:

23

Zumindest in Bash und der Z-Shell gibt es einen schnelleren Weg:

CONFIG_DATA=$(<config)

Um aus der Manpage der Bourne Again-Shell zu zitieren:

Die Befehlssubstitution $ (Cat-Datei) kann durch die entsprechende, aber schnellere $ (<Datei) ersetzt werden.

Kamaraj
quelle
1
Ich würde dies nicht als gute Option betrachten. Was auch immer die Gefühle von OP gegenüber nutzlosem Gebrauch von Katzen sind, das Beispiel des OP ist so einfach, dass die meisten Bash-Benutzer es verstehen würden. Es ist auch ziemlich tragbar. Jetzt $(<file)ist es viel seltener, so dass es zu viel mehr WTFs führen kann. und der Geschwindigkeitsgewinn aus dieser Operation, wenn eine solche Konfiguration in eine Variable geladen werden soll, ist wahrscheinlich vernachlässigbar
MatthewRock
6
@MatthewRock beachten Sie, dass viele sehr schlechte Praktiken üblich und vertraut sind. Die nutzlosen Verwendungen von Katzen sind ein Beispiel, for i in $(cat file); do ...ein anderes. Dass sie häufig vorkommen, ist kein Grund, weiterhin schlechte Werkzeuge zu verwenden. Was nicht heißt, dass diese besondere Verwendung von Katze ein schlechtes Tooi ist, ich bin mir nicht sicher, ob es einen tragbareren Weg gibt. Ich sage nur, dass allgemein und vertraut! = Gut.
Terdon