次のような文字列があります。set mystring "$ENV_NAME/c/a/b/c"
フルパスを取得するには?
フル パスを取得するには、 を使用する必要がありますfile join
。env
環境変数にアクセスするには、グローバル配列にアクセスする必要があります。
set fullPath [file join $env(ENV_NAME) c a b c]
の場合ENV_NAME=/usr/bin
、上記は として返さfullPath
れ/usr/bin/c/a/b/c
ます。Windows プラットフォームでも同様の結果が得られます。
残念ながら、あなたの質問はあまり明確ではありません。
set mystring "$ENV_NAME/c/a/b/c"
これは、ユーザーが入力したものであるか、プログラム/Tcl スクリプトの一部である可能性があります。
これが実際にユーザー提供の入力である場合は、次を使用することをお勧めしますeval
。
proc substEnv {input} {
set __ENV [array get ::env]
dict with __ENV {}
eval $input
}
puts [substEnv {set mystring "$ENV_NAME/c/a/b/c"}]
ユーザーを信頼できる場合は問題ありません。それ以外の場合は、安全なインタープリターを使用することをお勧めします。安全なインタープリターは配列にアクセスできないため、::env
配列の内容を安全なインタープリターに渡す必要があることに注意してください。
file join
ただし、これがプログラムの一部である場合は、代わりに使用することをお勧めします
set path [file join $::env(ENV_NAME) c a b c]
file join
$::env(ENV_NAME)
ルートディレクトリなどを扱います( /
* nixまたはC:\
windowsでは、どちらも特殊なケースとしてパスセパレーターで終わります)