2013-10-02 4 views
2

У меня есть сценарий BASH, называемый script.sh, который принимает 3 аргумента и запускает с ними исполняемый файл. Первые два являются просто цифрами, но последний аргумент дает входной файл. Я хотел бы, чтобы сценарий запускал исполняемый файл с вводом в качестве аргумента исполняемого файла и использовал «<» в качестве замены для stdin. (Т.е.Выполнение переменных команд в BASH

bash script.sh 5 1 input.txt 

вызывает Баш скрипт, и содержимое script.sh следующим образом:

#!/bin/bash 

command1="./l${1}t${2} $3" 
command2="./l${1}t${2} < $3" 

echo + ${command1} 
${command1} 

echo + ${command2} 
${command2} 

Когда эхо command1 я получаю

./l5t1 input.txt 

что именно то, что я хочу, и он отлично работает.

Когда я эхо command2, я получаю

./l5t1 < input.txt 

, который снова является тем, что я хочу. Проблема заключается в фактической команде, выполняемой сценарием:

./l5t1 '<' input.txt 

который, конечно же, вызывает ошибку сегментации в моей программе.

Я хотел бы знать, есть ли способ, которым я могу запустить команду 2, чтобы она выполняла строку точно так же, как она печатается в выходе эха. Честно говоря, я понятия не имею, почему одиночные кавычки даже вставлены вокруг символа <.

+1

В любом случае, вы должны быть в состоянии 'eval' содержимое переменной. – Rubens

ответ

4

Если вы хотите хранить команды, лучше использовать функции, чем переменные. Как вы узнали, перенаправления не работают при хранении в переменных (и не |, ;, или &).

command1() { 
    "./l${1}t${2}" "$3" 
} 

command2() { 
    "./l${1}t${2}" < "$3" 
} 

command1 "[email protected]" 
command2 "[email protected]" 

Здесь я определил две функции, которые вызываются с аргументами из массива [email protected]. "[email protected]" перенаправляет аргументы сценария к функциям.

Обратите внимание, что я поставил котировки вокруг "./${1}t${2}" и "$3". Использование двойных кавычек позволяет этим параметрам содержать пробелы. Либеральная цитата - хорошая техника для создания защитных сценариев.

(я настоятельно рекомендую не делать eval "$command2". Использование eval действительно опасная привычка попасть.)

+0

Это именно то, что мне нужно! Спасибо за помощь и отличное объяснение! –

Смежные вопросы