shell脚本中命令失效的问题解决指南

12次阅读
没有评论

问题描述

最近遇到了一个问题:一个shell命令能够独立运行以正常退出应用,但是在将其加入到sh shell脚本时却执行失败。具体症状是在终端模拟器或adb shell环境中直接执行am force-stop com.myapp.frustrated命令可以正常退出应用,但是将相同命令放置于以下shell脚本中却无效:

#!/bin/sh
am force-stop com.myapp.frustrated

这导致我们想知道为什么同样的命令在脚本中就不能执行,并寻求解决方案。

解决方案

方案1:修复shebang行和命令执行环境

问题定位:shebang行指定的解释器不存在

原始脚本中的#!/bin/sh指定了使用的shell位于/bin目录下,但在Android设备上并不存在该路径。正确的做法是使用系统提供的sh或更准确来说,是/system/bin/sh作为解释器来执行脚本。

#!/system/bin/sh  # 正确的shebang行
am force-stop com.myapp.frustrated

解决办法:

  • 将shebang行修改为指向正确的shell路径。
  • 或者你也可以直接在命令前加上/system/bin/sh,使其明确使用哪个解释器。这种方式也能让脚本保持简洁:
/system/bin/sh -c "am force-stop com.myapp.frustrated"

方案2:检查shell脚本权限与执行环境

  • 确保脚本文件具有执行权限:可以使用chmod +x scriptname.sh命令授权。
  • 如果是在adb shell环境中运行脚本,请确保当前的工作目录确实包含了你的脚本。由于路径改变或环境问题可能会导致无法找到脚本。

方案3:处理换行符

  • 确保脚本文件的换行符是符合目标操作系统的标准(一般为LF,即换行符),因为某些情况下自动将Windows格式转换到Unix/Linux系统上的文本编辑器可能会保留多余的空格或换行符导致问题。

依据评论反馈

根据其他用户的提示,还可以考虑:
– 确认/bin/sh确实是有效路径或可能已经指向了正确的位置。例如,在现代Android版本中/bin通常会直接指向/system/bin

通过以上几种方法检查和修改,基本上可以解决shell命令在脚本中无法执行的问题。希望这些解决方案能够帮助到遇到同样问题的开发者!

正文完