Comment stocker le tuyau (|) dans une variable?

12

L'idée serait de l'utiliser comme ... un tuyau dans une commande. Par exemple: disons qu'il y a une sorte de long chemin qui doit être retapé encore et encore, suivi d'un tube et d'un deuxième programme

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

J'aimerais que cette partie soit stockée dans une variable, donc elle pourrait être utilisée comme ceci:

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

Au lieu de cela, je reçois

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

... ce qui signifie que la pipe n'a clairement pas fonctionné.

laur
la source
1
Bien que vous le puissiez eval, vous créez généralement une fonction.
frostschutz

Réponses:

21

bash ne réinterprète pas complètement la ligne de commande après avoir développé les variables. Pour forcer cela, mettez evalen avant:

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

Néanmoins, il existe des moyens plus élégants de le faire (alias, fonctions, etc.).

jofel
la source
8

Vous essayez de mélanger du code et des données, ce qui n'est pas une bonne idée. Au lieu de cela, définissez une fonction qui prend un nom de fichier (répertoire?) Comme argument et l'affiche avec less.

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

view directory1/directory2/directory3 <searchterm>
chepner
la source