【问题标题】:how to make the bash script portable?如何使 bash 脚本可移植?
【发布时间】:2013-04-11 14:19:47
【问题描述】:

我编写了一个依赖于当前文件夹结构的 bash 脚本, 我应该怎么做才能让它在任何其他文件夹中运行(变得可移植)? 让我解释一下:我希望脚本删除脚本正在运行的当前目录中的所有文件, 或删除父文件夹中的所有文件, 解决办法是什么?

【问题讨论】:

  • 请给我们看脚本。
  • 请出示一些代码。
  • 你能分享一些代码吗?
  • 你能给我们一个你想要的例子吗?如果程序在/foo/bar 中,我从/opt/bar/foo/foo 运行它,你希望它像我在/foo/bar 中运行它一样工作并删除/foo/bar 中的所有文件?
  • 假设脚本正在删除我的 bash 脚本正在运行的目录中的所有文件,如果它在 /foo/bar/ 中运行,则删除 /foo/bar/* 中的所有文件,如果我复制脚本文件到另一个文件夹,如 /xx/yy/ 然后删除 /xx/yy/* 的文件

标签: bash portability


【解决方案1】:
cd "$(dirname "$0")"

将此添加到脚本的顶部以将其cd 添加到脚本的安装目录。然后你可以使用相对路径,它们将相对于脚本目录而不是用户的pwd

如果由于某种原因 dirname 不可用,这里有一个等效的语句,它使用 basename 代替。

cd "${0%%/$(basename "$0")}"

【讨论】:

  • 感谢 john,但我应该如何在我的脚本中编写 rm /foo/bar/* 以便它可以在任何地方工作?
  • 你可以简单写rm *
  • 什么系统有basename但没有dirname?
  • @glennjackman 好问题。我在我的一个脚本中列出了基本名称版本作为目录名称之一的替代品。我不确定什么环境需要这种解决方法。附近的评论说在编写 Red Hat Kickstart 安装脚本时需要它......但如果这是真的,那就不再是这种情况了。我刚刚测试了 RHEL 6.4,并且 dirname 和 basename 在 Kickstart 时都可用。
  • dirname 似乎有效,但我不确定 $0,因为在尝试使用您的建议时出现以下错误:No such file or directory 如何测试 $0 在我的系统中是否有效?
【解决方案2】:

不要在脚本中使用绝对路径。

【讨论】:

  • 不要讨厌。答案是正确且适当的,因为问题中缺少其他信息,为什么要投反对票?
【解决方案3】:

我们需要更多信息来为您提供正确的答案...但如果您需要使其可移植,一些提示是将您需要的任何文件存储在网络共享上,并简单地从/ 中创建一个新文件夹,例如作为/temporaryScriptFolder/ 并将网络共享安装到该空文件夹,使您可以轻松访问任何必要的资源。

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多