Bash脚本:如何将参数传递给另一个运行脚本的函数?

时间:2013-11-19 19:52:45

标签: linux bash terminal

我试图从另一个调用一个正在运行的脚本的函数,然后传递给它一个参数(在运行时)

//原始脚本

#!/bin/bash

VALUE_OF_EXIT_CODE=256

/bin/bash /home/dev/runningScript.sh arg1 arg2

# some code
doSomething ($VALUE_OF_EXIT_CODE) 

//运行脚本

#!/bin/bash

function doSomething(){
     EXIT_CODE=$1
}

while(//something)
do
if [ "$EXIT_CODE" == 0 ]; then
     echo "normal exit => OK"  
     exit 0
fi
# If the exit code is not 0, then there was a error.
if [ "$EXIT_CODE" > 0 ]; then
    echo "Error => $EXIT_CODE"
    exit $EXIT_CODE 
fi
done

我希望我在原始脚本中设置的exit_code传递给正在运行的脚本,以便对其进行评估,并继续执行任何必须执行的操作或退出。

3 个答案:

答案 0 :(得分:0)

Bash无法正常工作。这是你应该做的:

  1. 将VALUE_OF_EXIT_CODE写入临时文件,例如tmp。
  2. 如果您知道正在运行的脚本文件的名称,则可以使用pidof获取其pid。
  3. 然后使用`kill - '向脚本指示可以使用的东西。
  4. 您的运行脚本应该已编码为从tmp文件中读取。它应该读取该值并做任何必要的事情。
  5. 另一种方法是使用mkfifo创建命名管道。您的运行脚本应该从管道读取为STDIN,而您的“另一个”脚本可以将其作为STDOUT写入。

    可能还有其他方法可以在两个不同的运行bash脚本之间传递信息,但bash中的多线程编程还有很长的路要走。

答案 1 :(得分:0)

在我看来,这是错误的方式。制作你称之为“运行脚本”的“原始脚本”会更容易,而不是相反。

然后您可以使用$?阅读退出代码,并使用它调用函数:

myFunction $?

答案 2 :(得分:0)

对于此类功能, 每种 语言都依赖于进程间消息传递。 在bash中,它总是有点hackish,因为它不是“煮熟和准备好”。

我尝试尽可能少地改变你的代码(尽管修复了一些语法) 您现在可以选择IPC机制:ram或disk上的文件或命名管道。 插座也是可能的,甚至可以使用inotify kerneldaemon。

这个在tmpfs中使用命名管道并使用signal

//原始脚本

#!/bin/bash
mkfifo "/tmp/$$" ; exec 3<>"/tmp/$$"  
doSomething() { echo "$1" >&3 ; pkill -SIGUSR1 "runningScript.sh" ;}


VALUE_OF_EXIT_CODE=256

/home/dev/runningScript.sh $arg1 $arg2 &


# some code

doSomething "$VALUE_OF_EXIT_CODE" 

//运行脚本

#!/bin/bash

trap "read EXIT_CODE <&3" SIGUSER1

while something
do
if [ $EXIT_CODE = 0 ]; then
     echo "normal exit => OK"  
     exit 0
fi
# If the exit code is not 0, then there was a error.
if [ $EXIT_CODE -gt 0 ]; then
    echo "Error => $EXIT_CODE"
    exit $EXIT_CODE 
fi
done