【问题标题】:Run bash script as source without source command在没有源命令的情况下将 bash 脚本作为源运行
【发布时间】:2010-10-19 15:31:25
【问题描述】:

有什么方法可以将脚本标记为“作为源运行”,这样您就不必添加source 或“。”每次都命令它?即,如果我编写一个名为“sup”的脚本,我想将其称为

sup Argument

而不是

source sup Argument

. sup Argument

基本上,我正在尝试在脚本中使用cd

【问题讨论】:

  • 请澄清。使脚本可执行的问题和在脚本中使用“cd”的问题不是一回事。
  • "有没有办法将脚本标记为“作为源运行”,这样您就不必每次都添加源或“.”命令?"
  • 您在这里有两个不同的问题,这就是我要求澄清的原因。您可以使脚本可执行,然后就不需要“。”或“源”,但他们将无法修改调用者环境(您执行的外壳)。所以 cd 对调用者没有任何改变。不同的问题。

标签: bash dot-source


【解决方案1】:

Bash 在它之前分叉并启动一个 subshel​​l 方式,或者您的内核甚至考虑它应该在那里做什么。这不是您可以“撤消”的事情。所以不,这是不可能的。

谢天谢地。

改为查看bash 函数:

sup() {
    ...
}

把它放在你的~/.bashrc中。

【讨论】:

    【解决方案2】:

    在运行 shell 时,有两种方法可以调用 shell 脚本:

    • 执行脚本会产生一个新进程,该脚本正在其中运行。这是通过键入脚本名称来完成的,如果它是可执行的并且以

      #!/bin/bash
      行,或者直接调用
      /bin/bash mycmd.sh
    • 采购脚本在其父外壳(即您正在输入命令的外壳)内运行它。这是通过键入

      source mycmd.sh
      . mycmd.sh

    因此,没有来源的 shell 脚本中的 cd 永远不会传播到其父 shell,因为这会违反进程隔离。

    如果您只对 cd 感兴趣,则可以使用 cd "shortcuts" 摆脱脚本...查看 bash 文档,位于 CDPATH env var。

    否则,您可以使用别名来键入单个命令,而不是 source 或 .:

    alias mycmd="source mycmd.sh"
    

    【讨论】:

    • 我确实修改了我的 CDPATH,但是当脚本在其“自己的”shell 中执行时它似乎仍然不起作用
    • 是的,当然,因为更改不会传播到您正在使用的父 shell。我的评论更多是关于完全摆脱脚本的方法。
    • 太完美了!我什至从没想过给它起别名
    【解决方案3】:

    为其创建别名:

    alias sup=". ~/bin/sup"
    

    或者沿着这些路线。

    另请参阅:Why doesn't cd work in a bash shell script?


    通过反例回答评论:在 Solaris 10 上进行 Korn Shell 实验表明我可以做到:

    $ pwd
    /work1/jleffler
    $ echo "cd /work5/atria" > $HOME/bin/yyy
    $ alias yyy=". ~/bin/yyy"
    $ yyy
    $ pwd
    /work5/atria
    $
    

    在 Solaris 10 上使用 Bash (3.00.16) 进行的实验也显示了相同的行为。


    【讨论】:

    • 嗯,别名有效,但仍然在单独的 shell 中执行,因此脚本中的“cd”什么也不做。不过谢谢!
    • 在这种情况下,可能在引用的问题中使用 CDPATH 解决方案?这是我最常用的。剧本中究竟有什么?只是一张“CD”还是更多的东西?
    【解决方案4】:

    如果在调用时对脚本进行子外壳,则无法在当前环境中获取脚本。

    但是,您可以检查脚本是否来源,如果不是,则强制脚本终止:

    if [ -z "$PS1" ] ; then
        echo "This script must be sourced. Use \"source <script>\" instead."
        exit
    fi
    

    同样,您可以强制脚本不作为来源,而是改为子外壳(保留当前外壳环境):

    if [ "$PS1" ] ; then
        echo "This script cannot be sourced. Use \"./<script>\" instead."
        return
    fi
    

    两个版本都可以作为 gists 获得:请参阅 please sourcedon't source

    【讨论】:

    • 顺便说一句,echo -e 并不理想——即使 shell 始终是 bash,有时它也会在输出时打印 -e,具体取决于 xpg_echo 和 @987654329 的值@ 标志(因为 POSIX echo 规范允许对-n 进行特殊处理,严格符合 POSIX 标准的 echo 不允许对 -e 做任何事情,除了在输出上打印它)。请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html,尤其包括应用程序用法和基本原理部分。
    • 谢谢这是一个错字,在这里没有用。已删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多