2017-08-13 76 views
1

我有不同的命令组成的文本文件时,未找到:庆典 - 命令解析与命令的文本文件

set +e; false; echo $? 
(false;   echo foo); echo \ $? 
for i in .; do (false; echo foo); echo \ 1:$?; done; echo \ 2:$? 

等。

我想在整个bash子进程中使用set -e一行一行地测试这些命令,然后检查父bash进程中的错误代码以查看该子进程是否退出并显示错误。我被困在如何处理更简单的命令(例如上面列出的第一个命令)。这是我最近的尝试之一:

mapfile file < "$dir"/errorData 
bash -c "${file[0]}" 
echo $? 

回报

bash: set +e: command not found 
bash: false: command not found 
bash: echo 127: command not found 

我试过几个变种没有运气。使用bash -c \'"${file[1]}"\'会导致发现一条关于未找到命令的错误消息,现在将上述三个字符串合并为一个长字符串。当然,只需用强引号将文件命令打包并直接在交互式shell中将它们提供给bash即可。

编辑:我使用的是bash 4.4.12(1)

+0

我不能在Bash v4.3.48上重现这些错误。一切正常。 – randomir

+0

您确定要执行(-c)“$ {file [0]}”吗?或者您是否想要执行该操作? “$ {file [0]}”? – yacc

+0

@yacc没有-c,命令失败,因为bash正在等待文件或目录。 – LumpyGrads

回答

1

任何人谁认定的壳解析其文本的方式,似乎违反参考手册,请务必检查任何复制输入数据用于不可见的控制字符。例如。我在输入文件中找到了一个非破坏性空间来代替简单的空白,看起来像是一个简单的空白。从网页复制到编辑器或命令行时,这尤其常见。 bash使用空格,制表符和换行符来标记化,而不是非空白空间(Unicode标准中的U + 0020)。十六进制编辑器,例如hexfiend,可以帮助解决类似的问题。

+0

您粘贴的数据不包含任何非破坏性空间(U + 0020是常规空间,U + 00A0是非破坏性空间)。这是为什么总是将测试用例复制到新目录并运行它的好主意之一。 –

+0

我输入了你在这里看到的数据,因为它只是几十行的样本。我粘贴了我使用的实际数据。 – LumpyGrads