来源的 shell 脚本是否有可能知道它的位置?我读过确定来源的shell脚本路径,但答案集中在bash和tcsh,如果使用POSIX外壳失败。$0也不是解决方案并产生错误的结果。
解决方案不需要 100% 可靠。路径不太可能包含硬链接或符号链接。
# sourcing the script should yield the absolute path to the script
. somedir/thescript
# within “thescript”
-> /tmp/foo/bar/somedir
Run Code Online (Sandbox Code Playgroud)
一些背景:该脚本是现有应用程序的一部分,其中包含bin与源脚本相关的已知位置(因架构而异)的目录中的数十个二进制文件。要使用该应用程序,用户需要将bin目录PATH放在 .
这是我尝试的简单脚本
#!/bin/bash DIR="$(cd "$(dirname $0)" && pwd)" echo $DIR
当我执行它时$ ./my_script.sh,正确获取路径。
但是,当我像这样获取它时$ source my_script.sh,它会获取路径/bin
如何通过源获取脚本的路径?
源代码和执行代码有什么区别?
来自 bash 手册
_
在 shell 启动时,设置为用于调用在环境或参数列表中传递的正在执行的 shell 或 shell 脚本的绝对路径名。随后,在扩展后扩展到上一个命令的最后一个参数。还设置为用于调用在导出到该命令的环境中执行和放置的每个命令的完整路径名。检查邮件时,此参数保存邮件文件的名称。
关于粗体的句子,斯蒂芬说
bash 与其他一些 shell 一样,会将
_环境变量传递给它执行的命令,其中包含 bash 用作execve()系统调用第一个参数的路径。Run Code Online (Sandbox Code Playgroud)$ env | grep '^_' _=/usr/bin/env
如何获取_任意命令的环境变量值而不是env, 以验证其值是该命令的可执行文件或脚本的路径名?
谢谢。
我想将路径和文件名分配给变量:
/path/to/myfile/file.txt
Run Code Online (Sandbox Code Playgroud)
例如
MYFILE=$(pwd)$(basename)
Run Code Online (Sandbox Code Playgroud)
我该怎么做 ?