无法从我自己的包中运行脚本

Ale*_*x F 6 package-management command-line dpkg bash scripts

我使用本指南创建了一个简单的包,但我无法在其中运行脚本。

有一个名为 的文件夹mypack,其中包含/usr/bin/myscript.sh一些命令(假设它只是回显诸如“Hello World”之类的消息),以及一个以DEBIAN包含control此文本的文件命名的文件夹:

Package: mypack
Version: 1.0-1
Maintainer: Alex
Architecture: all
Section: misc
Description: echo me
Run Code Online (Sandbox Code Playgroud)

我使用构建和安装它dpkg-deb --build mypackdpkg -i mypack.deb正如指南所说。

最后,当我想运行脚本脚本以查看它是否有效时,我做不到。我试过了:

  1. myscript(返回myscript: command not found
  2. myscript.sh(返回bash: /usr/bin/myscript.sh: Permission denied
  3. sudo myscript.sh(返回sudo: myscript.sh: command not found
  4. mypack myscriptmypack myscript.sh(都返回mypack: command not found

那么我如何执行它,所以它确实有效,或者我错过了一些重要的步骤,这不允许我运行脚本?

Tho*_*ard 8

您的脚本未设置为可执行文件;就像不是通过打包安装的脚本一样,您需要确保它设置了可执行位。

您有两个选择:

  1. 创建包时,请确保您的脚本创建包之前设置了可执行位,通过在您的工作目录中运行它在构建包之前

    chmod +x /path/to/script.sh

或者...

  1. 使用postinst脚本程序包来设置可执行位安装。向.postinst脚本中添加类似于以下内容的命令:

    chmod +x /usr/bin/myscript.sh

对于我的一些事情,我使用这两种方法只是为了确保它将事情设置为可执行文件。这有时会让人头疼,但确定总比不确定要好。至少在我看来。


至于脚本不能作为 执行myscript,那是因为myscriptmyscript.sh不同的对象

如果需要,请在您.postinst的包脚本中执行以下操作:

ln -s /usr/bin/myscript.sh /usr/bin/myscript
Run Code Online (Sandbox Code Playgroud)

...然后假设您修复了可执行位问题,那么它应该适用于您尝试的两个版本,包括myscript.shmyscript.

然而,正确的方法是将脚本打包为myscript而不包含 shell 扩展。然后,您应该在开头 (#!)包含一个 shebang 行,指示要使用的解释器。因为.sh可以是任何东西。然后,将软件包设置为仅安装myscript. 正如穆鲁所说,你应该避免在你的 postinst 中建立链接,但这取决于你想要做什么。有许多不同的方法可以实现您的目标,但在打包文档中并没有非常严格的指导。