如何在Nu Shell中获取被source的脚本文件路径?
在Nu Shell中获取被source脚本的自身路径
在Nu Shell中,$env.FILE_PWD仅能返回主执行脚本的所在目录,当脚本被source加载时,这个变量不会指向被加载脚本的自身路径。比如你遇到的场景:
问题复现代码
main.nu
source ./lib/func.nu echo $"Script file: ($env.FILE_PWD)" echo $"Sourced file: (get-sourced-file)"
./lib/func.nu
export def get-sourced-file [] { # 此处返回的是main.nu的路径,而非自身路径 $env.FILE_PWD }
执行nu main.nu后输出:
Script file: /tmp/test Sourced file: /tmp/test
解决方案
Nu Shell提供了$env.SOURCED_FILE_PATHS环境变量,它是一个列表,按加载顺序记录了所有被source的文件的绝对路径。对于当前被加载的脚本来说,它的路径会是这个列表的最后一项。
修改./lib/func.nu如下:
export def get-sourced-file [] { # 获取当前被source脚本的绝对路径 let self_file_path = $env.SOURCED_FILE_PATHS | last # 获取该脚本所在的目录路径 $self_file_path | path dirname }
再次执行nu main.nu,输出会变为:
Script file: /tmp/test Sourced file: /tmp/test/lib
补充说明
如果存在多层嵌套source的情况,$env.SOURCED_FILE_PATHS会按加载顺序依次存入路径,此时可以根据嵌套层级选择对应的列表项,而非固定取最后一项。
内容的提问来源于stack exchange,提问作者tkokasih
相关产品推荐
相关产品推荐

