Como armazenar pipe (|) em uma variável?

12

A idéia seria usá-lo como ... um cano em um comando. Por exemplo: digamos que exista algum tipo de caminho longo que precise ser redigitado repetidamente, seguido por um canal e um segundo programa, ou seja,

"directory1/directory2/direcotry3/file.dat | less -I "

Gostaria que essa parte fosse armazenada em uma variável, para que pudesse ser usada assim:

r="directory1/directory2/direcotry3 \| less -I -p "
$ cat path1/path2/$r <searchterm>

Em vez disso, eu recebo

cat: invalid option -- I
Try `cat --help' for more information.

... o tubo claramente não funcionou.

laur
fonte
1
Enquanto você pode eval, geralmente você faz uma função.
frostschutz 19/09/2013

Respostas:

21

O bash não reinterpreta completamente a linha de comando após expandir as variáveis. Para forçar isso, coloque evalna frente:

r="directory1/directory2/direcotry3/file.dat | less -I "
eval "cat path1/path2/$r"

No entanto, existem maneiras mais elegantes de fazer isso (aliases, funções etc.).

jofel
fonte
8

Você está tentando misturar código e dados, o que não é uma boa ideia. Em vez disso, defina uma função que use um nome de arquivo (diretório?) Como argumento e a exiba com less.

view () {
    less -I -p "$2" $1
}

view directory1/directory2/directory3 <searchterm>
chepner
fonte