Como executar o comando que está em uma variável

2

Minha condição é como abaixo. Alguém poderia ajudar por favor?

SEARCH="find 'pwd' -name"

bash> $SEARCH resources.xml | grep $SEARCH_DIR | grep $1 | grep ‘cells’

Mas não estou obtendo o pwd como mencionado nessa variável.

Por favor ajude

    
por Rajagopalarao 09.06.2016 / 11:23

2 respostas

3

alias SEARCH='find . -name'

Ou

SEARCH() { find . -name "$1"; }

Uso

SEARCH resources.xml | ...

Observe que SEARCH não é uma variável. Você poderia definir o comando como uma variável ( SEARCH='find . -name' ), mas o alias ou definição de função é uma prática mais comum.

    
por 09.06.2016 / 11:51
2

Digamos que o diretório atual seja /original/directory no momento em que a linha SEARCH=… for avaliada e /later/directory no momento em que a linha $SEARCH … for avaliada.

A substituição do comando 'pwd' é avaliada no momento em que a variável SEARCH é definida, portanto SEARCH é definido como find /original/directory -name . Se o diretório atual nesse momento não contiver espaços em branco ou caracteres curinga, o $SEARCH resources.xml chamará find nesse diretório, ou seja, find /original/directory -name resources.xml .

Se o diretório atual original contiver espaços em branco ou curingas, isso não funcionará. Encher um comando em uma variável como esta não funciona, exceto em casos muito simples. Veja Por que meu script de shell engasgar com espaço em branco ou outros caracteres especiais?

Se você quiser executar find em /later/directory , poderá executar find . . Mas uma variável não é a ferramenta certa aqui. Uma variável é para armazenar uma string. Um comando com parâmetros não é uma string, é uma lista de strings. E um snippet de código de shell pode ser armazenado em uma string, mas $SEARCH não executa o valor de SEARCH como um trecho de código de shell (mais uma vez, veja Por que meu shell script engasga com espaço em branco ou outros caracteres especiais? / a>). Para armazenar um fragmento de código de shell para uso posterior, defina uma função.

SEARCH () {
  find "$PWD" -name "$@"
}
…
SEARCH resources.xml | …

Mais uma vez, isso executa find em /later/directory . Se você quiser executar find em /original/directory , a melhor maneira é armazenar esse diretório em uma variável e usar essa variável posteriormente.

original_directory="$PWD"
SEARCH () {
  find "$original_directory" -name "$@"
}
…
SEARCH resources.xml | …
    
por 10.06.2016 / 02:46