关于以下设置: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外壳的情况下缺少引号删除也是我的命令字符串的实际问题。有什么可能的原因,解决方案?
答案 0 :(得分:1)
请注意,
"'"*audio*"'"
星号不从外壳中逸出。如果与*audio*
相匹配的文件位于当前工作目录中,则shell会很高兴地使它们遍历。如果'
确实是文件名的一部分,则您要改用"'*audio*'"
。然后find
将搜索名为'*audio*'
的文件(其中find
(不是外壳程序,会为*
进行globe))。
如果您只想查找与*audio*
(名称中任何地方的音频)匹配的文件,请使用-name "*audio*"
等。
如果您确切地告诉我们您要查找的文件名,这将有所帮助。