在启动可执行文件之前以bash方式获取脚本文件

时间:2010-04-09 10:48:29

标签: bash exec wrapping

我正在尝试编写一个bash脚本,它“包装”用户想要调用的任何内容(及其参数),在实际调用它之前获取一个固定文件。

澄清一下:我有一个“ConfigureMyEnvironment.bash”脚本,必须在启动某些可执行文件之前获取源代码,所以我想要一个“LaunchInMyEnvironment.bash”脚本,你可以像以下一样使用它:

LaunchInMyEnvironment <whatever_executable_i_want_to_wrap> arg0 arg1 arg2

我尝试了以下LaunchInMyEnvironment.bash:

#!/usr/bin/bash
launchee="$@"
if [ -e ConfigureMyEnvironment.bash ];
     then source ConfigureMyEnvironment.bash;
fi

exec "$launchee"

我必须使用“launchee”变量来保存$ @ var,因为在执行source之后,$ @变为空。

无论如何,这不起作用并且失败如下:

myhost $ LaunchInMyEnvironment my_executable -h
myhost $ /home/me/LaunchInMyEnvironment.bash: line 7: /home/bin/my_executable -h: No such file or directory
myhost $ /home/me/LaunchInMyEnvironment.bash: line 7: exec: /home/bin/my_executable -h: cannot execute: No such file or directory

也就是说,似乎“-h”参数被视为可执行文件名的一部分而不是参数...但它对我来说并没有多大意义。 我也尝试使用$ *代替$ @,但没有更好的结果。

我做错了什么?

安德烈。

5 个答案:

答案 0 :(得分:3)

您是否尝试删除exec命令中的双引号?

答案 1 :(得分:2)

试试这个:

#!/usr/bin/bash
typeset -a launchee
launchee=("$@")
if [ -e ConfigureMyEnvironment.bash ]; 
  then source ConfigureMyEnvironment.bash; 
fi 
exec "${launchee[@]}"

那将使用数组来存储参数,因此它甚至可以处理“space delimited string”和“string with; inside”之类的调用

Upd:简单示例

test_array() { abc=("$@"); for x in "${abc[@]}"; do echo ">>$x<<"; done; } test_array "abc def" ghi

应该给出

>>abc def<<
>>ghi<<

答案 2 :(得分:0)

你可能想尝试这个(未经测试):

#!/usr/bin/bash
launchee="$1"
shift
if [ -e ConfigureMyEnvironment.bash ];
     then source ConfigureMyEnvironment.bash;
fi

exec "$launchee" $@

exec的语法是exec command [arguments],但是因为你引用了$launchee,这被视为一个参数 - 即命令,而不是命令及其参数。另一种变化可能只是:exec $@

答案 3 :(得分:0)

只需在没有exec

的情况下正常执行
#!/usr/bin/bash
launchee="$@"
if [ -e ConfigureMyEnvironment.bash ];
     then source ConfigureMyEnvironment.bash;
fi

$launchee

答案 4 :(得分:0)

尝试划分你的争论列表:

  

ALL_ARG = “$ {@}”
  可执行= “$ {1}”
  Rest_of_Args = $ {ALL_ARG ## $可执行}

然后尝试:

  

$ Executable $ Rest_of_Args
  (或exec $ Executable $ Rest_of_Args)

调试器