GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Befehlsersetzung:Teilung bei Zeilenumbruch, aber nicht bei Leerzeichen?

Ich weiß, dass ich dieses Problem auf verschiedene Arten lösen kann, aber ich frage mich, ob es eine Möglichkeit gibt, es nur mit Bash-Einbauten zu tun, und wenn nicht, wie es am effizientesten geht.

Ich habe eine Datei mit Inhalten wie

AAA
B C DDD
FOO BAR

womit ich nur meine, dass es mehrere Zeilen hat und jede Zeile Leerzeichen haben kann oder nicht. Ich möchte einen Befehl wie

ausführen
cmd AAA "B C DDD" "FOO BAR"

Wenn ich cmd $(< file) verwende Ich bekomme

cmd AAA B C DDD FOO BAR

und wenn ich cmd "$(< file)" verwende Ich bekomme

cmd "AAA B C DDD FOO BAR"

Wie bekomme ich jede Zeile mit genau einem Parameter behandelt?

Akzeptierte Antwort:

Portabel:

set -f              # turn off globbing
IFS='
'                   # split at newlines only
cmd $(cat <file)
unset IFS
set +f

Oder verwenden Sie eine Subshell, um das IFS zu erstellen und Option ändert lokal:

( set -f; IFS='
'; exec cmd $(cat <file) )

Die Shell führt eine Feldaufteilung und Dateinamengenerierung für das Ergebnis einer Variablen- oder Befehlsersetzung durch, die nicht in doppelten Anführungszeichen steht. Sie müssen also die Generierung von Dateinamen mit set -f ausschalten , und konfigurieren Sie die Feldaufteilung mit IFS nur Zeilenumbrüche getrennte Felder zu machen.

Mit bash- oder ksh-Konstrukten ist nicht viel zu gewinnen. Sie können IFS erstellen lokal für eine Funktion, aber nicht set -f .

In bash oder ksh93 können Sie die Felder in einem Array speichern, wenn Sie sie an mehrere Befehle übergeben müssen. Sie müssen die Erweiterung zum Zeitpunkt des Aufbaus des Arrays steuern. Dann "${a[@]}" erweitert sich auf die Elemente des Arrays, eines pro Wort.

set -f; IFS=$'n'
a=($(cat <file))
set +f; unset IFS
cmd "${a[@]}"

Linux
  1. Warum verschlingt die Shell-Befehlsersetzung ein nachgestelltes Newline-Zeichen?

  2. Abfangen von Fehlern bei der Befehlsersetzung mit „-o Errtrace“ (dh Set -e)?

  3. Befehlsersetzung mit „?

  4. id:Befehl nicht gefunden

  5. w:Befehl nicht gefunden

ifrename:Befehl nicht gefunden

ln:Befehl nicht gefunden

CentOS hat php72 installiert, aber Befehlszeilen-PHP funktioniert nicht

`ssh <host>` ist eine Login-Shell, aber `ssh <host> <command>` nicht?

Linux - Mount-Befehl gibt Null/0 zurück, funktioniert aber nicht

SCP zulassen, aber keine tatsächliche Anmeldung mit SSH