Insira o redirecionamento usando o comando e opções

0

Eu estou tentando escrever um script que aceita 2 parâmetros - nome do programa e sinalizadores opcionais.

Estou tentando executar o comando do programa em um input_file e armazenar a saída no output_file.

$input_file < $($program options) > output_file

Eu tentei várias combinações de sintaxe para alcançar o comportamento acima, mas estou recebendo erros como: redirecionamento ambíguo, erro de E / S, etc.

Exemplo:

./execute cat -n 

Dentro do programa eu quero escrever código de tal forma que o cat seja aplicado no arquivo de entrada

não funcionou:

$(${1} ${2} names.txt) > test.out
names.txt < $($1 $2) > test.out
    
por KLMM 25.01.2016 / 08:30

2 respostas

2

Você entendeu mal a sintaxe. Primeiro, o redirecionamento de entrada tem o símbolo < na frente do arquivo, não na parte de trás. A ordem das operações não é importante. Então, a sintaxe é:

< inputfile command options > outputfile

ou

command options < inputfile > outputfile

(ou outras permutações).

Então, você também tem $ extra. O que você realmente precisa fazer é

$program $options <$inputfile >$outputfile

Você pode substituir ${program} e ${options} por $1 e $2 .

Neste formulário, você pode fazer

#!/bin/bash
<names.txt $1 $2 >test.out

E chame-o como ./execute cat -n ou mesmo ./execute cat '-n -s' se você quiser mais de uma opção. Nesse formulário, você pode ter várias opções, mas precisa colocá-las entre aspas (porque $2 ) não é citado, os espaços expandem o parâmetro de volta para várias palavras.

Outra (melhor) maneira de fazer isso seria usar

#!/bin/bash
<names.txt "$@" >test.out

Agora, você pode passar um número arbitrário de parâmetros para o script, e você pode até ter strings entre aspas nos argumentos e elas permanecem juntas após a propagação no script. Agora isso funciona: ./execute cat -n - "bla bla.txt" (o formulário anterior dividiria o nome do arquivo em duas partes).

    
por 25.01.2016 / 09:14
0

Esta é uma solução possível:

concatene o comando e a sequência de opções para que não tenhamos que lidar com muitos parênteses.

command="$1 $2"
$command input_file > output_file

(Por favor, deixe-me saber se estou com alguma coisa)

    
por 25.01.2016 / 09:12