【问题标题】:Use Unix Executable File to Run Shell Script and MPKG File使用 Unix 可执行文件运行 Shell 脚本和 MPKG 文件
【发布时间】:2015-06-22 21:53:16
【问题描述】:

我有 2 个 shell 脚本和 2 个 mpkg 安装程序,我正在尝试使用 unix 可激发文件来运行它们。这是我的脚本,但它总是有错误消息“没有这样的文件或目录”?

#!/bin/sh
# Find the absolute script current path
path=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

sudo sh $path/join.sh
sudo sh $path/join2.sh

#/usr/sbin/installer -dumplog -verbose -pkg $path/“esetv8.mpkg" -target /
#/usr/sbin/installer -dumplog -verbose -pkg $path/“sccm.mpkg” -target /


exit 0

非常感谢!

【问题讨论】:

  • 在这里工作正常,您确定文件存在吗?您应该更加小心并首先检查它们是否存在,例如:[ -f "${path}/join.sh" ] && sudo sh "${path}/join.sh"。请注意,如果目录包含空格,您的版本将失败,请在这种情况下添加引号。
  • 添加一个echo $path 并验证它不包含空格和其他特殊字符。
  • 谢谢,贝壳鱼。你说的对。我的目录包含 2 个空格。这就是它失败的原因:)
  • 酷,让我写一个答案,这样人们以后就不会犯同样的错误了。
  • 另外,我还有一个问题,你知道为什么我每次运行脚本时,首先列出当前脚本目录中的所有文件夹名称吗?谢谢!

标签: macos shell unix


【解决方案1】:

处理包含目录和文件路径的变量时最常见的问题是出现特殊字符,例如空格。为了正确处理这些,您应该始终使用双引号引用变量。因此,更好的代码应该是:

sudo sh "$path/join.sh"
sudo sh "$path/join2.sh"

还建议使用花括号将变量括起来,这也有助于避免不必要的问题。产生以下代码:

sudo sh "${path}/join.sh"
sudo sh "${path}/join2.sh"

虽然这应该可行,但也值得一提的是,建议在执行文件之前检查文件是否实际存在。可以使用-f 检查文件是否存在,使用-x 检查执行权限。正确的代码是:

[ -f "${path}/join.sh" ] && [ -x "${path}/join.sh" ] && sudo sh "${path}/join.sh"
[ -f "${path}/join2.sh" ] && [ -x "${path}/join2.sh" ] && sudo sh "${path}/join2.sh"

请注意,如果您有很多这些,最好使用 for 循环执行它们。另请注意,-f 在检查 -x 时变得多余,因此更好的代码是:

[ -x "${path}/join.sh" ] && sudo sh "${path}/join.sh"
[ -x "${path}/join2.sh" ] && sudo sh "${path}/join2.sh"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多