代码之家  ›  专栏  ›  技术社区  ›  adam.hendry

Shell脚本中Dot(`.`)/Source命令的参数

  •  0
  • adam.hendry  · 技术社区  · 3 年前

    我试图使用现有的代码库,但遇到了问题。简而言之,我执行一个shell脚本(让我们称之为 A )谁的 第一幕 是调用另一个脚本( B ). 脚本 B 位于我当前的目录中(这是我使用的程序的要求)。软件手册参考了 bash ,但是评论在 A. 表明它是在 ksh 我一直在做手术 猛击 到目前为止。

    里面 A. ,要执行的行 B 简单地说:

    . B
    

    它使用“点空间”语法来调用程序。它不会做任何不寻常的事情,比如 sudo .

    当我打电话的时候 A. 没有点空间语法,即:

    ./A
    

    它总是错误地说找不到文件 B 我补充道 pwd , ls , whoami , echo $SHELL ,以及 echo $PATH 线到 A. 调试并确认 B 事实上,就在那里,脚本正在以相同的方式运行 $SHELL 当我在命令提示符下时,该脚本与我是同一用户,并且该脚本具有相同的搜索路径 $PATH 正如我所做的那样。我还验证了我是否这样做:

    B
    

    在命令行上,它工作得很好。但是,如果我更改内部的语法 A. 致:

    ./B
    

    相反,那么 A. 成功执行。

    同样,如果我执行 A. 使用点空间语法,然后两者都使用 . B ./B 工作。

    总结 :
    ./A 仅在以下情况下有效 A. 包含 B 语法。
    . A 工作为 A. 无论是 B B 语法。

    我理解使用点空间(即。 A. )语法执行时不会分叉到子shell,但考虑到文件显然就在那里,我看不出这会导致我观察到的行为。我是否缺少语法或父/子进程工作区的细微差别?魔术?

    更新1 :添加的信息表明该脚本可能是在 ksh ,当我使用时 猛击 .
    更新2 :添加了检查以验证 $PATH 是一样的。

    更新3 :剧本说这是为 ksh ,但它正在磨合 猛击 针对Kenster的回答,我发现跑步 bash -posix 然后 B 在命令行上失败。这表明命令行和脚本之间的环境差异在于后者正在运行 猛击 在POSIX兼容模式下,而命令行则不是。再近一点看,我在 猛击 man 页面:

    当作为sh调用时,bash在读取启动文件后进入posix模式。

    这个 shebang 对于 A. 确实如此 #!/bin/sh .

    总之,当我跑步时 A. 如果没有点空间语法,它将分叉到自己的子shell,该子shell处于POSIX兼容模式,因为 谢邦 #!/bin/sh (例如。, #!/bin/bash 这是命令行和脚本运行时环境之间的关键区别,导致 A. 无法找到 B .

    0 回复  |  直到 10 年前