首页 文章

如何从另一个shell脚本调用shell脚本?

提问于
浏览
527

我有两个shell脚本, a.shb.sh .

如何从shell脚本 a.sh 中调用 b.sh

16 回答

  • 711

    假设新文件是“/ home / satya / app / app_specific_env”,文件内容如下

    #!bin/bash
    
    export FAV_NUMBER="2211"
    

    将此文件引用附加到〜/ .bashrc文件

    source /home/satya/app/app_specific_env
    

    如果您重新启动机器或重新登录,请在终端中尝试 echo $FAV_NUMBER . 它将输出该值 .

    如果您想立即查看效果,请在命令行中使用 source ~/.bashrc .

  • 7

    依赖于取决于 . 简单地说......如果你想在当前控制台上加载变量并执行,你可以在你的代码上使用 source myshellfile.sh . 例:

    !#/bin/bash
    set -x
    echo "This is an example of run another INTO this session."
    source my_lib_of_variables_and_functions.sh
    echo "The function internal_function() is defined into my lib."
    returned_value=internal_function()
    echo $this_is_an_internal_variable
    
    set +x
    

    如果你只想执行一个文件,结果就是唯一有用的东西,你可以这样做:

    !#/bin/bash
    set -x
    ./executing_only.sh
    sh i_can_execute_this_way_too.sh
    bash or_this_way.sh
    set +x
    

    我希望能帮助你 . 谢谢 .

  • 1

    最佳答案建议将 #!/bin/bash 行添加到被调用的子脚本的第一行 . 但即使你添加了shebang,在子shell中运行脚本并捕获输出也要快得多:

    $(source SCRIPT_NAME)

    当你想继续运行相同的解释器(例如从bash到另一个bash脚本)并且确保不执行子脚本的shebang行时,这种方法有效 .

    例如:

    #!/bin/bash
    SUB_SCRIPT=$(mktemp)
    echo "#!/bin/bash" > $SUB_SCRIPT
    echo 'echo $1' >> $SUB_SCRIPT
    chmod +x $SUB_SCRIPT
    if [[ $1 == "--source" ]]; then
      for X in $(seq 100); do
        MODE=$(source $SUB_SCRIPT "source on")
      done
    else
      for X in $(seq 100); do
        MODE=$($SUB_SCRIPT "source off")
      done
    fi
    echo $MODE
    rm $SUB_SCRIPT
    

    输出:

    ~ ❯❯❯ time ./test.sh
    source off
    ./test.sh  0.15s user 0.16s system 87% cpu 0.360 total
    
    ~ ❯❯❯ time ./test.sh --source
    source on
    ./test.sh --source  0.05s user 0.06s system 95% cpu 0.114 total
    

    *例如,当病毒或安全工具在设备上运行时,执行新进程可能需要额外的100毫秒 .

  • 3

    我正在寻找的答案:

    ( exec "path/to/script" )
    

    如上所述, exec 替换shell而不创建新进程 . However ,我们可以将它放在子shell中,这是使用parantheses完成的 .

    编辑:其实 ( "path/to/script" ) 就足够了 .

  • 1

    您可以使用 /bin/sh 来调用或执行另一个脚本(通过您的实际脚本):

    # cat showdate.sh
     #!/bin/bash
     echo "Date is: `date`"
    
     # cat mainscript.sh
     #!/bin/bash
     echo "You are login as: `whoami`"
     echo "`/bin/sh ./showdate.sh`" # exact path for the script file
    

    输出将是:

    # ./mainscript.sh
     You are login as: root
     Date is: Thu Oct 17 02:56:36 EDT 2013
    
  • 174

    首先,您必须包含您调用的文件:

    #!/bin/bash
    . includes/included_file.sh
    

    然后你像这样调用你的函数:

    #!/bin/bash
    my_called_function
    
  • 13

    只需添加一行就可以在终端中输入任何内容来执行脚本!
    例如 . :

    #!bin/bash
    ./myscript.sh &
    

    如果要执行的脚本不在同一目录中,只需使用脚本的完整路径即可 .
    例如:`/home/user/script-directory/./myscript.sh&

  • 71

    简单的资源将帮助您 . 对于Ex .

    #!/bin/bash
    echo "My shell_1"
    source my_script1.sh
    echo "Back in shell_1"
    
  • 13

    您可以通过以下几种方式执行此操作:

    • 使其他脚本可执行,在顶部添加 #!/bin/bash 行,并将文件所在的路径添加到$ PATH环境变量 . 然后你可以把它称为普通命令;

    • 或者使用 source 命令(别名是 . )调用它,如下所示: source /path/to/script ;

    • 或使用 bash 命令执行它: /bin/bash /path/to/script ;

    第一个和第三个方法将脚本作为另一个进程执行,因此无法访问另一个脚本中的变量和函数 .
    第二种方法在第一个脚本的进程中执行脚本,并从另一个脚本中提取变量和函数,以便可以从调用脚本中使用它们 .

    在第二种方法中,如果您在第二个脚本中使用 exit ,它也将退出第一个脚本 . 在第一种和第三种方法中不会发生这种情况 .

  • 9
    pathToShell="/home/praveen/"   
    chmod a+x $pathToShell"myShell.sh"
    sh $pathToShell"myShell.sh"
    
  • 1
    #!/bin/bash
    
     # Here you define the absolute path of your script
    
     scriptPath="/home/user/pathScript/"
    
     # Name of your script
    
     scriptName="myscript.sh"
    
     # Here you execute your script
    
     $scriptPath/$scriptName
    
     # Result of script execution
    
     result=$?
    
  • 4
    chmod a+x /path/to/file-to-be-executed
    

    这是我唯一需要的东西 . 一旦要执行的脚本像这样可执行,您(在我的情况下)在调用脚本时不需要任何其他额外操作,如 sh./ .

    感谢@Nathan Lilienthal的评论

  • 4

    使用反引号 .

    $ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`
    

    然后获取 生产环境 者脚本的输出作为使用者脚本的参数 .

  • 6

    看一下这个 .

    #!/bin/bash
    echo "This script is about to run another script."
    sh ./script.sh
    echo "This script has just run another script."
    
  • 0

    有几种方法可以做到这一点 . 终端执行脚本:

    #!/bin/bash
    SCRIPT_PATH="/path/to/script.sh"
    
    # Here you execute your script
    "$SCRIPT_PATH"
    
    # or
    . "$SCRIPT_PATH"
    
    # or
    source "$SCRIPT_PATH"
    
    # or
    bash "$SCRIPT_PATH"
    
    # or
    eval '"$SCRIPT_PATH"'
    
    # or
    OUTPUT=$("$SCRIPT_PATH")
    echo $OUTPUT
    
    # or
    OUTPUT=`"$SCRIPT_PATH"`
    echo $OUTPUT
    
    # or
    ("$SCRIPT_PATH")
    
    # or
    (exec "$SCRIPT_PATH")
    

    All this is correct for the path with spaces!!!

  • 51

    从其他文件导入函数有一些问题 .
    First :您无需执行此文件可执行文件 . 最好不要这样做!只需添加

    . file
    

    导入所有功能 . 并且所有这些都将在您的文件中定义 .
    Second :您可以定义具有相同名称的函数 . 它将被覆盖 . 这不好 . 你可以这样声明

    declare -f new_function_name=old_function_name
    

    然后才进行导入 . 所以你可以用新名称调用旧函数 .
    Third :您只能导入文件中定义的完整功能列表 . 如果有些不需要你可能会取消它们 . 但是如果你在未设置之后重写你的功能,它们将会丢失 . 但是如果您按照上面的描述设置对它的引用,则可以在取消设置后使用相同的名称进行恢复 .
    Finally 在通常的导入程序中是危险的而不是那么简单 . 小心!您可以编写脚本来更轻松,更安全地执行此操作 . 如果只使用部分功能(不是全部),最好将它们分成不同的文件 . 不幸的是,这种技术在bash中表现不佳 . 例如在python和其他一些脚本语言中,它简单而安全 . 可以使用自己的名称仅部分导入所需的函数 . 我们都希望在下一个丛林版本中将完成相同的功能 . 但是现在我们必须写许多额外的鳕鱼才能做到你想要什么 .

相关问题