¿Cómo almacenar tubería (|) en una variable?

12

La idea sería usarlo como ... una tubería en un comando. Por ejemplo: digamos que hay algún tipo de camino largo que debe ser reescrito una y otra vez, seguido de una tubería y un segundo programa, es decir

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

Me gustaría que esa parte se almacene en una variable, por lo que podría usarse así:

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

En cambio, me sale

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

... lo que significa que la tubería claramente no funcionó.

laur
fuente
1
Mientras puedas eval, generalmente haces una función.
frostschutz

Respuestas:

21

bash no reinterpreta completamente la línea de comando después de expandir las variables. Para forzar esto, pon evaldelante:

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

Sin embargo, hay formas más elegantes de hacerlo (alias, funciones, etc.).

jofel
fuente
8

Estás intentando mezclar código y datos, lo cual no es una buena idea. En su lugar, defina una función que tome un nombre de archivo (directorio?) Como argumento y lo muestre con less.

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

view directory1/directory2/directory3 <searchterm>
chepner
fuente