Wie speichere ich Pipe (|) in einer Variablen?

12

Die Idee wäre, es als ... Pipe in einem Befehl zu verwenden. Zum Beispiel: Angenommen, es gibt einen langen Pfad, der immer wieder neu eingegeben werden muss, gefolgt von einer Pipe und einem zweiten Programm, d. H.

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

Ich möchte, dass dieser Teil in einer Variablen gespeichert wird, damit er folgendermaßen verwendet werden kann:

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

Stattdessen bekomme ich

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

... was bedeutet, dass die Pfeife eindeutig nicht funktioniert hat.

laur
quelle
1
Während Sie könnten eval, machen Sie normalerweise eine Funktion.
Frostschutz

Antworten:

21

bash interpretiert die Befehlszeile nach dem Erweitern von Variablen nicht vollständig neu. Um dies zu erzwingen, setzen Sie evalvor:

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

Es gibt jedoch elegantere Möglichkeiten, dies zu tun (Aliase, Funktionen usw.).

Jofel
quelle
8

Sie versuchen, Code und Daten zu mischen, was keine gute Idee ist. Definieren Sie stattdessen eine Funktion, die einen Dateinamen (Verzeichnis?) Als Argument verwendet und mit anzeigt less.

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

view directory1/directory2/directory3 <searchterm>
chepner
quelle