バックグラウンド
チルダ置換は、Tcl が文字列をファイル名として解釈しようとしている時点でのみ発生し、文字列の最初の文字が a である場合にのみ発生します~
(文字が他の場所にある場合、それは純粋に正常です)。行われる置換は正確に 2 つあります。
- が単独であるか、またはディレクトリ セパレータが後に続く場合
~
は、ホーム ディレクトリを参照します (正確には、HOME
環境変数で指定されたディレクトリを参照します。これはデフォルトでホーム ディレクトリになります)。
~
の後に何か他のものが続く場合、文字列の最後までのファイル名の残りまたは最初のディレクトリ区切り文字 (どちらか先に来る方) がユーザー名として解釈され、~user
シーケンスはそのユーザーのホーム ディレクトリ (検索されたディレクトリ) に置き換えられます。/etc/passwd
Unix などでリストされているように、システム ユーティリティを使用する)
これらの機能は、安全なインタープリター (つまり、interp create -safe
または で作成されたインタープリター) では無効になっていsafe::interpCreate
ます。
回避策
リーディング~
が問題にならないようにする最も簡単な方法は、その前に置き./
、常に-directory
to オプションを使用することglob
です (それ以外の場合は、この種のファイル名をあいまいに生成できる Tcl の唯一の場所です。それ以外の場所では、おそらく意図されています)。 )。全体を通して完全なファイル名で作業すると、通常、全体的な問題が少なくなります (可能であれば、作業ディレクトリを変更しないことをお勧めします。これは、途方もない混乱を招くだけです)。
安全なインタープリターには他にも多くの制限された機能があるため (たとえば、デフォルトではファイルシステムにまったくアクセスできないなど)、安全なインタープリターを回避策とは見なしません。
ポリシーの問題
それを無効にできるはずだという提案については… 興味深いものですが、Tcl の運営委員会で真剣に取り上げられることはありませんでした。問題は、現在の動作を想定しているコードがたくさんあることです。ハック (サポートされていない魔法の変数など) を追加してオフにすることは特に問題にはならないと思います— 展開が行われるポイントにインタープリター コンテキストがあるので、Tcl 変数をチェックして、そうするかどうかを確認します。些細なことですが、個人的には、このような変更によって何が予期せず壊れてしまうのか、非常に心配です。
スタック オーバーフローは、そのような変更について議論するのに適した環境ではありません。tcl-core メーリング リストで質問したほうがよいでしょう。それは時々かなり堅実な討論室であることに注意してください(事実上常に礼儀正しいですが)。別の方法 (IRC が好きな場合) は、freenode の #tcl で質問することです。