看起来Busybox外壳没有执行引号删除操作

时间:2018-08-13 14:36:24

标签: linux shell adb quotes busybox

关于以下设置:Linux机器,bash,adb,带有Busybox的嵌入式Linux目标系统。 对于目标系统,适用以下条件:

adb shell echo $SHELL
/bin/sh

adb shell echo $0
/bin/sh

问题是我的find命令在某些脚本中找不到任何东西(已通过其他方式证明,实际上所寻找的项目确实存在于目标上)。我的命令:

adb -s $AdbID shell find  / -type f \( -name "'"*audio*"'" -or     -name "'"*alsa*"'" \) \
 \( -path "'"/usr/lib/*"'" -or -path "'"/usr/bin/*"'" -or -path "'"/etc/*"'" \) 

如果要使用echo进行调试,则echo将以下字符串作为输入参数:

$ adb -s $AdbID shell echo find  / -type f \( -name "'"*audio*"'" -or -name "'"*alsa*"'" \) \
\( -path "'"/usr/lib/*"'" -or -path "'"/usr/bin/*"'" -or -path "'"/etc/*"'"  \)
find / -type f ( -name '*audio*' -or -name '*alsa*' ) \
( -path '/usr/lib/*' -or -path '/usr/bin/*' -or -path '/etc/*' )

注意:以上记录使用转义的换行符,因此您无需在此处滚动太多,但是原始命令中未使用这些内容。

我猜同样适用于查找是否要从命令字符串中删除回显。 对我来说,在扩展所有其他种类之后,Busybox似乎并没有像我以前在Bash中那样删除引号。 Ash似乎是Busybox shell,在手册中没有单词reg。发现去除了引号,因此不知道灰分在这方面如何工作。

如果要用Windows台式机+ dos命令行替换Linux主机,则其余元素(如上述情况*)可以正常工作。在以下几点可以看出差异:

*)实际上也是其他目标系统,但是在这一方面没有有意更改,因此,关于目标系统,这两种设置应该相同。

如果要使用echo进行调试,则echo将得到以下字符串:

c:\adb_shell>adb -s 2233445 shell echo find  / -type f \
\( -name "'"*audio*"'" -or -name "'"*alsa*"'" \) \
\( -path "'"/usr/lib/*"'" -or -path "'"/usr/bin/*"'" -or -path "'"/etc/*"'"  \)
find / -type f ( -name *audio* -or -name *alsa* ) \
( -path /usr/lib/* -or -path /usr/bin/* -or -path /etc/* )

此命令从外壳中获取输入参数的字符串,并删除引号。

我刚刚意识到自己写此问题的那一刻,命令分组也无法按预期工作(busybox shell将消耗寄生函数,因此“查找”不会收到它们),让我们在其他范围内解决这个问题。命令可能会出现更多此类错误。

我相信在链中有两个Linux外壳的情况下缺少引号删除也是我的命令字符串的实际问题。有什么可能的原因,解决方案?

1 个答案:

答案 0 :(得分:1)

请注意,

"'"*audio*"'"

星号从外壳中逸出。如果与*audio*相匹配的文件位于当前工作目录中,则shell会很高兴地使它们遍历。如果'确实是文件名的一部分,则您要改用"'*audio*'"。然后find将搜索名为'*audio*'的文件(其中find(不是外壳程序,会为*进行globe))。

如果您只想查找与*audio*(名称中任何地方的音频)匹配的文件,请使用-name "*audio*"等。

如果您确切地告诉我们您要查找的文件名,这将有所帮助。