将bash脚本作为源代码运行,而不使用source命令

将bash脚本作为源代码运行,而不使用source命令,bash,Bash,有没有办法将脚本标记为“作为源代码运行”,这样您就不必每次都向其添加源代码或“.”命令?i、 例如,如果我写一个名为“sup”的脚本,我想把它称为 sup Argument 而不是 source sup Argument 或 基本上,我尝试在脚本中使用cd。为其创建别名: alias sup=". ~/bin/sup" 或者沿着这些路线 另见: 通过反例回答评论:在Solaris 10上使用Korn Shell的实验表明,我可以做到: $ pwd /work1/jleffler $ ec

有没有办法将脚本标记为“作为源代码运行”,这样您就不必每次都向其添加
源代码
或“.”命令?i、 例如,如果我写一个名为“sup”的脚本,我想把它称为

sup Argument
而不是

source sup Argument


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

为其创建别名:

alias sup=". ~/bin/sup"
或者沿着这些路线

另见:


通过反例回答评论:在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时,有两种方法可以调用shell脚本:

  • 执行脚本会生成一个新进程,脚本将在其中运行。如果脚本名是可执行的,并且以
    #!/bin/bash
    
    source mycmd.sh
    
    Bash会在它或您的内核考虑它应该在其中做什么之前,分叉并启动子shell。这不是你可以“撤销”的东西。所以不,这是不可能的

    谢天谢地

    而是查看
    bash
    函数:

    sup() {
        ...
    }
    

    将其放在
    ~/.bashrc

    中,如果在调用时对脚本进行分壳,则无法在当前环境中生成脚本

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

    if [ -z "$PS1" ] ; then
        echo "This script must be sourced. Use \"source <script>\" instead."
        exit
    fi
    
    if[-z“$PS1”];然后
    echo“此脚本必须源代码。请改用“源代码”
    出口
    fi
    
    同样,您可以强制脚本不要来源,而是进行子外壳(保留当前外壳环境):

    if[“$PS1”];然后
    echo“无法获取此脚本的源代码。请改用\”“/\”
    返回
    fi
    

    这两个版本均可作为GIST提供:请参阅和。

    请澄清。使脚本可执行的问题和在脚本中使用“cd”的问题不是一回事。“有没有办法将脚本标记为“作为源代码运行”,这样您就不必添加源代码或”“每次都向其添加命令?”这里有两个不同的问题,这就是我要求澄清的原因。您可以使脚本可执行,这样就不需要“.”或“源代码”,但它们将无法修改调用者环境(从中执行的shell)。所以cd不会改变调用者。不同的问题。我确实修改了CDPATH,但当脚本在其“自己的”shell中执行时,它似乎仍然不起作用是的,当然,因为更改不会传播到您正在使用的父shell。我的评论更多的是关于一种完全摆脱剧本的方法。太完美了!我甚至从未想过只使用alias itHmm,alias可以工作,但仍然在一个单独的shell中执行,因此脚本中的“cd”什么也不做。谢谢你!在这种情况下,是否可以使用引用问题中的CDPATH解决方案?这是我最常用的。剧本里到底是什么?仅仅是一张“cd”或者更多的东西?顺便说一句,
    echo-e
    并不理想——即使shell总是bash,有时它也会根据
    xpg\u echo
    posix
    标志的值在输出时打印
    -e
    (由于POSIX
    echo
    规范只允许对
    -n
    进行特殊处理,因此严格遵守POSIX的
    echo
    除了在输出上打印之外,不允许对
    -e
    进行任何操作)。请参阅,特别是包括应用程序用法和基本原理部分。感谢这是一个打字错误,此处没有任何用途。已删除。
    . mycmd.sh
    
    alias mycmd="source mycmd.sh"
    
    sup() {
        ...
    }
    
    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