Как хранить pipe (|) в переменной?

12

Идея состоит в том, чтобы использовать его как ... канал в команде. Например: скажем, есть какой-то длинный путь, который нужно набирать снова и снова, после чего следует канал и вторая программа, т.е.

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

Я бы хотел, чтобы эта часть была сохранена в переменной, чтобы ее можно было использовать так:

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

Вместо этого я получаю

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

... то есть труба явно не работала.

Laur
источник
1
Хотя вы можете eval, обычно вы делаете функцию.
frostschutz

Ответы:

21

bash не полностью интерпретирует командную строку после раскрытия переменных. Чтобы заставить это, поместите evalперед:

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

Тем не менее, есть более элегантные способы сделать это (псевдонимы, функции и т. Д.).

jofel
источник
8

Вы пытаетесь смешать код и данные, что не очень хорошая идея. Вместо этого определите функцию, которая принимает имя файла (каталога?) В качестве аргумента и отображает его с помощью less.

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

view directory1/directory2/directory3 <searchterm>
chepner
источник