unescape pipe em parâmetros

3

Eu quero escrever um script que aceite dois parâmetros, executando-os como comandos e despejando sua saída em arquivos. myscript.sh contents:

$1 > file1.tmp
$2 > file2.tmp

Isso funciona bem para o seguinte exemplo:

myscript.sh 'echo Hello World' 'echo Hello World 2'

file1.tmp agora contém o texto Hello World e file2.tmp contém texto Hello World 2

No entanto, isso é quebrado ao usar um comando que contém um canal:

myscript.sh 'ls | grep stuff' 'ls | grep morestuff'

ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access stuff: No such file or directory
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access morestuff: No such file or directory

Parece que o pipe está sendo escapado porque recebo uma saída semelhante como o primeiro erro se eu, por exemplo, executar isto:

ls \|

ls: cannot access |: No such file or directory

Como posso remover o escape do meu script?

    
por dtmland 07.03.2017 / 20:24

1 resposta

2

Você está passando um código shell para o script. Para o script, isso é apenas texto. Para que seja interpretado como um comando shell completo, você terá que eval it:

eval "$1" >file1.tmp
eval "$2" >file2.tmp

Isso funciona quando $1 e $2 são coisas simples como echo hello porque são comandos simples (não listas ou comandos compostos).

Uma analogia com outra linguagem de programação seria se você passasse uma parte do código C em um programa em C como uma cadeia de texto. O código teria que ser compilado (e vinculado) de alguma forma antes que pudesse ser executado como parte do programa.

    
por 08.03.2017 / 00:52