csh/tcsh では、eval で処理されるコマンドにリテラル中括弧を組み込むにはどうすればよいですか?

csh/tcsh では、eval で処理されるコマンドにリテラル中括弧を組み込むにはどうすればよいですか?

もう少し詳しく言うと、状況は次のようになります。

私は、サードパーティ ソフトウェアの環境とエイリアスを設定するためのモジュール ファイル (つまり、environment-modules パッケージで使用されるタイプ) を準備しようとしています。特に、いくつかのエイリアスが私を悩ませています。作者が提供しているシェル リソース ファイル (私はシェルに依存しない環境から脱却し、モジュール ファイルに興味がある) は、リテラルの中括弧を組み込んだエイリアスを設定します。同じ文字列をモジュール ファイルに入力しようとすると、中括弧の内容が展開されます。

csh/tcsh では、モジュールファイルの set-alias コマンドが処理され、シェルが提供する「alias」コマンドに変換されるようです。次に、次のように eval を使用して処理されます。

eval `alias foo 'thing to alias foo to';`

(はい、末尾のセミコロンはコマンドの一部です)。

モジュールのカスタム バージョンをコンパイルしない限り、eval、評価された文字列を囲む二重引用符の欠如、またはエイリアス テキストを囲む一重引用符などの要素のいずれも回避できませんが、これはやりたくありません。

さて、エイリアスに中括弧が含まれている場合、eval ステートメントのコンテキストで、中括弧が解釈されないように保護する方法がわかりません。ここから Timbuktu までバックスラッシュを試したり、二重引用符を試したり、一重引用符を試したり、二重引用符の中に一重引用符を入れたり、上記の組み合わせを試したりしました。これまでのところ、何も機能しておらず、不条理に近い状態です。徹底的に Google 検索しましたが、答えを見つけることができませんでした。

中括弧を回避する方法はありますか? ない場合は、お知らせください。そうすれば、私は自分のやり方を続けます。もし回避する方法があり、再コンパイルを伴わないのであれば、どんなアドバイスでもいただければ幸いです。よろしくお願いします!

答え1

tcsh/csh に対する私の解決策は少し冗長です。それは、別の変数に "{" を挿入することです。

  set lc="{"
  set rc="}"

エスケープに問題のあるドル記号にも同じことを行います。grep 正規表現に非常に便利です。

以下は私の .cshrc から切り取って貼り付けたものです:

  set dollar = \$

使用結果は、前述したように冗長ですが、少なくとも機能します。

> echo "${dollar}${lc}this is inside curlybraces${rc}"
${this is inside curlybraces}

追加の引用符が必要であることに注意してください。

お役に立てれば!

答え2

別の解決策:

set-alias foo {env LD_LIBRARY_PATH=`printf "\044\173LD_LIBRARY_PATH\175"`:/some/path command-to-run}

044、173、175はASCII文字$、{、}の8進コードです。

答え3

使用2つのシングルクォート中括弧を保護(エスケープ)します。変数をエコーするときに二重引用符(")が 1 つ必要になる場合があります。

set a=''{''
echo "$a"

また、バッククォート ( ) 内の echo は、エスケープされた括弧とともに使用できます。

set b = " COMMANDS `echo ''{''` MORE COMMANDS `echo ''}''` "  
echo "$b"

関連情報