如何为bash文件生成的每个命令分隔输出?

时间:2017-04-03 23:02:18

标签: linux bash shell

让我们说我们有一个类似下面的bash脚本:

echo test
ls -alh
pwd
echo test2

因此,文件上可以有任意数量的命令,每个命令产生或不产生自己的输出。

然后上面的文件像/bin/bash -xe test.sh一样运行,它将产生以下输出:

+ echo test
test
+ ls -alh
total 32
drwx------+  6 daniels  staff   204B Apr  3 23:33 .
drwxr-xr-x+ 64 daniels  staff   2.1K Apr  4 01:53 ..
-rw-r--r--@  1 daniels  staff   6.0K Apr  3 23:33 .DS_Store
drwxr-xr-x   5 daniels  staff   170B Mar 15 17:03 Todo
-rw-r--r--@  1 daniels  staff   282B Apr  3 20:39 test.py
-rw-r--r--@  1 daniels  staff    97B Apr  4 01:52 test.sh
+ pwd
/Users/daniels/Desktop
+ echo test2
test2

有没有办法解析生成的输出是否可靠,并找出如何根据每个命令分离输出?

对于上面的例子,我们应该能够用以下内容分离和提取一个组:

+ echo test
test

另一个

+ ls -alh
total 32
drwx------+  6 daniels  staff   204B Apr  3 23:33 .
drwxr-xr-x+ 64 daniels  staff   2.1K Apr  4 01:53 ..
-rw-r--r--@  1 daniels  staff   6.0K Apr  3 23:33 .DS_Store
drwxr-xr-x   5 daniels  staff   170B Mar 15 17:03 Todo
-rw-r--r--@  1 daniels  staff   282B Apr  3 20:39 test.py
-rw-r--r--@  1 daniels  staff    97B Apr  4 01:52 test.sh

我正在考虑解析输出并查看该行是否以+开头,然后将其作为一个命令的开头但是您可以轻松地使用echo + ok之类的东西来使这个逻辑失败

如果我们可以修改/bin/bash -x输出的字符,那么另一种选择就是{+ 1}}而不是+来输出类似https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text但看起来像+的字符串是硬编码的在bash中,不可配置。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

+不是硬编码的,man bashhelp set -x下的 -x After expanding each simple command, for command, case command, select command, or arithmetic for command, display the expanded value of PS4, fol‐ lowed by the command and its expanded arguments or associated word list. 很容易描述:

man bash

此处还有来自 PS4 The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace. The first character of PS4 is replicated multiple times, as necessary, to indicate mul‐ tiple levels of indirection. The default is ``+ ''. 的PS4的进一步说明:

$ PS4=$'\nAnd now, a word from '; set -x; date; uptime

And now, a word from date
Mon Apr  3 16:20:35 PDT 2017

And now, a word from uptime
 16:20:35 up 65 days,  1:24,  6 users,  load average: 1.20, 1.42, 1.37

以下是一个例子:

"<Motion>"

您可以使用它来根据需要嵌入特殊标记或字符。