Saída de script dependendo do parâmetro

2

Eu tenho um script que imprime algumas linhas de texto. Este texto é usado como configuração por outro processo.

Quando eu normalmente executo o programa, eu redireciono a saída padrão para o arquivo, o que é bom:

./generateConfig.sh > normal.cfg

Mas o problema é que normal.cfg é realmente constante e eu gostaria de dar ao usuário a opção de imprimir para arquivo ou na tela, fornecendo um parâmetro adicional (como -o, sem argumentos de parâmetro).

se o conteúdo do script for:

#!/bin/bash
echo "8.8.8.8"

Como eu parametrizaria a saída de modo que, dependendo de args, ela fosse impressa em arquivo ou stdout?

Isso não parece funcionar:

#!/bin/bash
output="/dev/stdout"
if [ $# -gt 0 ]; then
  output="normal.cfg"
fi
echo "8.8.8.8" > $output
    
por Kamil 25.02.2016 / 13:46

3 respostas

2

Várias abordagens:

Uma função

 #! /bin/sh -
 [ "$#" -gt 0 ] && redir=true || redir=false
 redir() if "$redir"; then "$@" > normal.cfg; else "$@"; fi

 redir echo 8.8.8.8

Um alias:

 #! /bin/sh -
 [ -z "$BASH_VERSION" ] || shopt -s expand_aliases

 [ "$#" -gt 0 ] && alias redir='>normal.cfg' || alias redir=

 redir echo 8.8.8.8

(não funciona com posh , o que desabilita aliases, ou se procura (com o comando . ) em implementações AT & T de ksh ).

Um descritor de arquivo dedicado:

 #! /bin/sh -
 [ "$#" -gt 0 ] && exec 3> normal.cfg || exec 3>&1

 echo 8.8.8.8 >&3

(lembre-se de que além do ksh93, não muitos shells configuram o sinalizador close-on-exec nesse fd3, então você pode querer fechá-lo para os comandos executados manualmente)

    
por 25.02.2016 / 14:38
3

Você pode redirecionar a saída do script inteiro usando exec .

#! /bin/bash

if [[ $1 = -o ]]
then
    exec > "$2"
fi

echo "8.8.8.8"

Agora, se você executar o script com -o foo , a saída estará no arquivo foo .

$ ./foo.sh 
8.8.8.8
$ ./foo.sh -o bar
$ cat bar
8.8.8.8
    
por 25.02.2016 / 13:56
-1

Experimente:

#!/bin/bash
output="normal.cfg"
if [ $# -gt 0 ]; 
 then
  echo "8.8.8.8" > $output
 else
  echo "8.8.8.8"
fi

Se você quiser fazer algo mais complexo, você pode tentar o comando tee : veja o exemplo aqui .

    
por 25.02.2016 / 13:54