Jak przechowywać potok (|) w zmiennej?

12

Chodzi o to, aby użyć go jako ... potoku w poleceniu. Na przykład: powiedzmy, że istnieje jakaś długa ścieżka, którą trzeba wielokrotnie powtarzać, a następnie potok i drugi program, tj.

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

Chciałbym, aby ta część była przechowywana w zmiennej, aby można ją było użyć w następujący sposób:

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

Zamiast tego rozumiem

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

... co oznacza, że ​​rura najwyraźniej nie działała.

Laur
źródło
1
Chociaż możesz eval, zwykle tworzysz funkcję.
frostschutz,

Odpowiedzi:

21

bash nie interpretuje całkowicie wiersza poleceń po rozwinięciu zmiennych. Aby to wymusić, umieść evalna wierzchu:

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

Niemniej jednak istnieją bardziej eleganckie sposoby (aliasy, funkcje itp.).

Jofel
źródło
8

Próbujesz łączyć kod i dane, co nie jest dobrym pomysłem. Zamiast tego zdefiniuj funkcję, która pobiera nazwę pliku (katalogu?) Jako argument i wyświetla go za pomocą less.

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

view directory1/directory2/directory3 <searchterm>
chepner
źródło