3

ファイルコマンド (およびその他のコマンド) でチルダ置換をオフにできないことについて、何かが行われたか、または行う予定がありますか? これについて私が読んだ最新のものはhttp://wiki.tcl.tk/28190ですが、プログラミング言語のこのような危険な機能を無視することはできませんか? C 関数 Tcl_TildeSubst() でグローバル Tcl 変数の存在をチェックし、それに基づいてチルダ展開を行うかどうかを確認するのと同じくらい簡単ではないでしょうか?

シェル スクリプトでは不十分な場合、私はよく Tcl スクリプトを作成します。多くの場合、ファイルの比較、コピー、オープン、削除、および/または名前の変更が含まれます。スクリプトを実行する前にfind、チルダ (~) で始まるファイル名を常にチェックしています。他の Tcl プログラマーがどのようにそれを行っているかを知りたいです。

4

1 に答える 1

6

バックグラウンド

チルダ置換は、Tcl が文字列をファイル名として解釈しようとしている時点でのみ発生し、文字列の最初の文字が a である場合にのみ発生します~(文字が他の場所にある場合、それは純粋に正常です)。行われる置換は正確に 2 つあります。

  1. が単独であるか、またはディレクトリ セパレータが後に続く場合~は、ホーム ディレクトリを参照します (正確には、HOME環境変数で指定されたディレクトリを参照します。これはデフォルトでホーム ディレクトリになります)。
  2. ~の後に何か他のものが続く場合、文字列の最後までのファイル名の残りまたは最初のディレクトリ区切り文字 (どちらか先に来る方) がユーザー名として解釈され、~userシーケンスはそのユーザーのホーム ディレクトリ (検索されたディレクトリ) に置き換えられます。/etc/passwdUnix などでリストされているように、システム ユーティリティを使用する)

これらの機能は、安全なインタープリター (つまり、interp create -safeまたは で作成されたインタープリター) では無効になっていsafe::interpCreateます。

回避策

リーディング~が問題にならないようにする最も簡単な方法は、その前に置き./、常に-directoryto オプションを使用することglobです (それ以外の場合は、この種のファイル名をあいまいに生成できる Tcl の唯一の場所です。それ以外の場所では、おそらく意図されています)。 )。全体を通して完全なファイル名で作業すると、通常、全体的な問題が少なくなります (可能であれば、作業ディレクトリを変更しないことをお勧めします。これは、途方もない混乱を招くだけです)。

安全なインタープリターには他にも多くの制限された機能があるため (たとえば、デフォルトではファイルシステムにまったくアクセスできないなど)、安全なインタープリターを回避策とは見なしません。

ポリシーの問題

それを無効にできるはずだという提案については… 興味深いものですが、Tcl の運営委員会で真剣に取り上げられることはありませんでした。問題は、現在の動作を想定しているコードがたくさんあることです。ハック (サポートされていない魔法の変数など) を追加してオフにすることは特に問題にはならないと思います— 展開が行われるポイントにインタープリター コンテキストがあるので、Tcl 変数をチェックして、そうするかどうかを確認します。些細なことですが、個人的には、このような変更によって何が予期せず壊れてしまうのか、非常に心配です。

スタック オーバーフローは、そのような変更について議論するのに適した環境ではありません。tcl-core メーリング リストで質問したほうがよいでしょう。それは時々かなり堅実な討論室であることに注意してください(事実上常に礼儀正しいですが)。別の方法 (IRC が好きな場合) は、freenode の #tcl で質問することです。

于 2012-08-28T08:32:44.923 に答える