Вы неправильно понимаете синтаксис. Во-первых, перенаправление ввода имеет символ <
перед файлом, а не позади него. Порядок действий не важен. Итак, синтаксис:
< inputfile command options > outputfile
или
command options < inputfile > outputfile
(или другие варианты).
Тогда у вас также есть лишние $
. Что вам действительно нужно сделать, так это
$program $options <$inputfile >$outputfile
. Вы можете заменить $ {program}
и $ {options}
на $ 1
и $ 2
.
В этой форме вы можете сделать
#!/bin/bash
<names.txt $1 $2 >test.out
и назвать это как ./ выполнить cat -n
или даже ./ выполнить cat '-n -s'
, если хотите более одного варианта. В этой форме у вас может быть несколько вариантов, но вы должны заключить их в кавычки (поскольку $ 2
) не цитируются, пробелы расширяют параметр обратно на несколько слов.
Другой (лучший) способ сделать это - просто использовать
#!/bin/bash
<names.txt "$@" >test.out
Теперь вы можете передать произвольное количество параметров в сценарий, и вы можете даже заключить строки в кавычки в аргументах, и они останутся вместе после распространения в сценарий. Теперь это работает: ./ выполнить cat -n - "bla bla.txt"
(предыдущая форма разделяла имя файла на две части).