2017-03-29 5 views
0

Ich kann irgendwie nicht herausfinden, wie Sie ein selbst geschriebenes Programm mit Argumenten aus einem Shell-Skript starten. Wenn ich in einem Ordner, deren übergeordneten Ordner enthält die binäre bin, dann kann ich das Programm mitSo starten Sie eine benutzerdefinierte Binärdatei mit Optionen und Argumenten aus einem Shellskript

$ ../binary --opt1 arg1 --opt2 arg2 

Jetzt beginnen, sagt die Argumente und Optionen in einer Datei args im aktuellen Ordner aufgelistet sind.

args.txt:

--opt1 arg1 --opt2 arg2 

Wenn ich versuche, die binäre von einem Shell-Skript im aktuellen Ordner wie ausführen:

$ ./script.sh args.txt 

script.sh:

#!/bin/bash 

if [ $# != 1 ] 
then 
    exit 1; 
fi 

params=$(<"$1") 

../binary "$params" 
# ../binary <<<"$params" doesn't work either. 

Wie kann ich das machen?

Edit (aktualisiert Skript):

#!/bin/bash 

if [ $# != 1 ] 
then 
    exit 1; 
fi 

params=$(<"$1") 

START=$(date +%s) 
../binary "$params" 
# ../binary <<<"$params" doesn't work either. 
END=$(date +%s)                                
DIFF=$(($END - $START))                     
echo "Test took $DIFF seconds" 

Antwort

0

Verwenden Befehl substituion:

$ ./script.sh args.txt 

Inhalt ./script.sh

#!/bin/bash 
../binary $(< "$1") 

Befehl Substitution

Mit der Befehlsersetzung kann die Ausgabe eines Befehls den Befehlsnamen ersetzen. Es gibt zwei Formen:

  $(command) 
    or 
      `command` 

heftiger Schlag führt die Expansion durch Befehl ausführen und den Befehl Substitution mit der Standardausgabe des Befehls ersetzt, mit irgendwelchen nachlauf newlines gelöscht. Eingebettete Zeilenumbrüche werden nicht gelöscht, aber sie können während der Worttrennung entfernt werden. Die Befehlssubstitution $(cat file) kann durch die äquivalente, aber schnellere $(< file) ersetzt werden.

Wenn die alten Stil Backquote Form der Substitution verwendet wird, behält Backslash seine wörtliche Bedeutung, außer wenn gefolgt von $, ` oder \. Das erste Rückwärtszitat, dem kein umgekehrter Schrägstrich vorausgeht, beendet die Befehlsersetzung. Bei Verwendung des Formulars $(command) bilden alle Zeichen zwischen den Klammern den Befehl; keine werden speziell behandelt.

Befehlssubstitutionen können verschachtelt sein. Verschachteln Sie die inneren Backquotes mit Backslashes, wenn Sie das Backquoted-Formular verwenden möchten. Wenn die Ersetzung in Anführungszeichen steht, werden Worttrennung und Pfadnamenerweiterung für die Ergebnisse nicht ausgeführt.

+0

Ich weiß, dass ich es aus einem Skript aufrufen möchte, weil ich den Befehl zwischen zwei "Zeitbefehle" einbetten, um die Latenz zu messen. Vielleicht sollte ich bearbeiten, um zu klären – FloriHe

+0

Ich bearbeitete die Antwort. Ich habe es auf diese Weise getestet und es funktioniert gut für mich. – cmks

+0

Arbeitete, aber ich denke, "$ 1" schreiben ist sicherer, wegen der Worttrennung. – FloriHe

Verwandte Themen