Atribuindo um comando à variável

5

Eu atribuo o comando ls à minha variável my_File , mas quando eu o executo como $my_File ele não funciona. Você pode por favor explicar por quê?

#!/bin/bash
my_File='ls -f | grep -v '\/''
$my_File
    
por RR_ 25.03.2014 / 19:26

4 respostas

11

A linha que você escreveu define uma variável cujo valor é a string ls -f | grep -v / . Ao usá-lo sem aspas, ele é expandido para uma lista de palavras (a string é dividida em espaço em branco): ls , -f , | , grep , -v , / . O caractere | não é especial, pois o shell está dividindo a string, não a analisando, portanto, ela se torna o segundo argumento para o comando ls .

Você não pode inserir um comando em uma string como essa. Para definir um nome abreviado para um comando, use um alias (se o comando estiver completo) ou uma função (se o comando tiver parâmetros e nada mais do que passar alguns argumentos padrão para um único comando). No seu caso, um alias serve.

alias my_File='ls -f | grep -v /'
my_File
    
por 26.03.2014 / 01:21
2
$ my_File='ls -f | grep -v '\/''
$ $my_File 
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
[snip]

Ao interpretar $my_File , o bash trata os caracteres como apenas caracteres. Assim, por um lado, a linha de comando tem um caracter literal | , não um pipe.

Se você está tentando executar $my_File na linha de comando e fazer com que os pipes funcionem, você precisa de eval $my_File .

    
por 25.03.2014 / 19:29
0
echo "${var='ls -f | grep -v "\/"'}" |sh

Você certamente precisa de um intérprete - embora não necessariamente eval .

. <<-HEREDOC /dev/stdin
    $var
HEREDOC

echo "$var" | . /dev/stdin

Existem muitas maneiras de chegar lá.

${0#-} -c "$var"

sh - c "$var"
    
por 26.03.2014 / 00:59
-1

variável = command

caractere backquote (')

assim como var = pwd echo $ var = / home / user / foo

    
por 20.01.2017 / 11:42

Tags