Ich habe eine Datei mit Befehlszeilenargumenten, die ich an ein anderes Skript übergeben möchte. Diese Datei enthält Elemente wie "param 1" param2 param3
. Geben Sie die Datei mit den Argumenten test.tmp
und der Skriptdatei script.sh
ein.Befehlszeilenargument von Dateiinhalt mit Zitat
Wenn ich tun:
script.sh -p `cat test.tmp` -other_params 1 2 3
Die script.sh
erhält nach p
:
"param
1"
param2
param3
Aber ich möchte:
param 1
param2
param3
Jede Idee?
Kleine Genauigkeit: angenommen, dass script.sh
nicht änderbar ist. Die Lösung muss in der Shell stattfinden.
In einer idealen Welt 'test.tmp' sollte in NUL- gespeichert werden Begrenzte Form - die * einzige * Syntax, die alle möglichen Werte speichern kann, ohne das Parsen zu erfordern. (Sicheres Parsen von Shell-Quoting ohne Sicherheitsrisiken einzugehen, z. B. Expansionen zuzulassen, ist überraschend schwierig - es sei denn, Sie übergeben den Job an "xargs", aber selbst dann ist sein Verhalten nicht _quite_ kompatibel mit tatsächlichen bash Parsing). Wenn Sie die Gelegenheit bekommen, die Leute, die 'script.sh' geschrieben haben, dazu zu ermutigen, dies zu überdenken, würde ich Ihnen vorschlagen, dies zu tun. –
Der von Tom vorgeschlagene 'mapfile -t'-Ansatz ist ebenfalls eine vernünftige Methode, * wenn * Sie eine Garantie haben, dass Ihre Argumente niemals literale Zeilenumbrüche enthalten müssen. –
BTW, siehe http://mywiki.wooledge.org/BashFAQ/050 und seine Links (dh zu den WordSplitting und Argumente Seiten) für einige Verständnis um * warum * das Standardverhalten passiert. –