如何在Bash中将一组命令传递给一个shell脚本

3
我想编写一个脚本,可以在命令行上输入一组命令(类似于“time”命令),执行这组命令,根据返回的错误代码做出相应处理(如果您感兴趣,我会让它调用我的桌面上的语音守护程序来回显命令是否失败或成功 - 用于一些长时间运行的构建过程)与unix时间命令不同,如果我有一组命令可以运行
> time (do_build && deploy_build)

我用我的命令(我称之为 tellme)进行尝试时,得到了以下结果:

> tellme (do_build && deploy_build)
bash: syntax error near unexpected token `do_build'

它似乎不喜欢将一组命令作为参数,即使对于time命令完全相同的事情也能正常工作。你有什么想法吗?

1
你能展示一下你脚本的部分吗? - Pier-Alexandre Bouchard
3个回答

3
我猜你需要做类似的事情。
tellme 'do_build && deploy_build'

并告诉我内部情况

eval "$*"

1

time 正在执行其 (do_build && deploy_build) 参数并等待它。

$ time (sleep 1; echo hello world;);
mundo

real    0m1.098s
user    0m0.030s
sys     0m0.000s

$ echo asd (sleep 1; echo hello world;);
bash: syntax error near unexpected token `('

$ (sleep 1; echo hello world;);
mundo

你不能随意使用子shell。

在你的情况下,你需要使用类似于以下的内容:

$ (sleep 1; echo hello world) && tellme && echo done;

关于子shell的信息很有用。提出的解决方案没有达到我所需的目的,因为我希望tellme命令知道正在运行的命令行,以便它可以将其回显给我(如果我有多个作业正在运行,我就会知道哪个完成了)。 - Andrew
@Andrew 嗯,那么在不修改 tellme 的情况下实现你想要的是不可能的。你必须让 tellme 接受参数,以便执行命令(例如时间,比如 tellme '(sleep 1; echo hello world)' 并从 tellme 运行 $1)或接受消息参数,例如 (sleep 1; echo hello world); tellme 'hello world finished!' - KurzedMetal

0

你可以做到

tellme "$(do_build && deploy_build)"

time 是一个 Bash 内置命令,如果你使用 /usr/bin/time 代替 time,你将会看到相同的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接