我正在尝试编写一个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”参数被视为可执行文件名的一部分而不是参数...但它对我来说并没有多大意义。 我也尝试使用$ *代替$ @,但没有更好的结果。
我做错了什么?
安德烈。
答案 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)
调试器