我有一个脚本tempenv
,我想使用如下:
$ tempenv ls -l
tempenv
看起来像这样:
#!/bin/bash
setarch ... /bin/bash -c $@
但是,它并没有按我的意愿工作。相反,它只运行第一个参数,而忽略其他任何内容。那就是tempenv ls -l
运行,好像tempenv ls
。
我有一个脚本tempenv
,我想使用如下:
$ tempenv ls -l
tempenv
看起来像这样:
#!/bin/bash
setarch ... /bin/bash -c $@
但是,它并没有按我的意愿工作。相反,它只运行第一个参数,而忽略其他任何内容。那就是tempenv ls -l
运行,好像tempenv ls
。
shell 的
-c
选项期望命令行作为一个参数,并$@
分成ls -l
两个。(也会如此"$@"
,只是它会保持带有空格的参数字符串完好无损,所以它也没有直接帮助。)所以,假设你想传递一个实际的命令行,你必须要么只传递一个字符串给脚本,然后用 传递它
sh -c "$1"
,或者如果你愿意,将脚本的所有参数连接成一个字符串,然后使用sh -c "$*"
,即看:
这将支持在命令行中包含所有 shell 语法,例如
但另一方面,应该包含空格的参数,例如带有空格的文件名,需要被引用两次,例如
man bash
:所以这对你有用:
鉴于您将
tempenv
脚本调用为tempenv ls -l
,即向其传递两个参数:命令名称和该命令的参数,听起来您实际上想要:也就是说,您希望
tempenv
在该不同架构下使用给定参数运行给定命令。如果您真的希望它有一些 shell 解释该不同架构下的某些代码,那么您会调用它,
tempenv 'ls -l'
因为该ls -l
代码由您在此处选择的 shell 解释。代码如下所示: