パイプ(|)を変数に保存するには?

パイプ(|)を変数に保存するには?

アイデアは...コマンドでパイプとして使用することです。たとえば、何度も何度も何度も入力する必要がある長いパスがあり、パイプと2番目のプログラムがあるとします。

"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.

...これはパイプが明らかに動作しないことを意味します。

答え1

bashは変数を展開した後にコマンドラインを完全に再解釈しません。これを強制するには、次をeval前に置きます。

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

それにもかかわらず、これを行うよりエレガントな方法(エイリアス、関数など)があります。

答え2

コードとデータを混在させようとしていますが、これは良い考えではありません。代わりに、ファイル(ディレクトリ?)名を引数として使用する関数を定義しますless

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

view directory1/directory2/directory3 <searchterm>

関連情報