Skip to content

shell 脚本编程二三事 #5

@muxfe

Description

@muxfe

bash

今天在 Ubuntu 的 bash 上卡了一天,最后发现竟然是一个很简单的问题。记录下来,也顺便发现自己在开发和学习上的不足。

最近实验室在开发一个 Nodejs 的容器应用,用于管理 Node 项目,使用 Java 语言,实现不同平台的应用。简单的想法是给每个项目写一个脚本,然后通过脚本来实现安装,启动和关闭等操作。Windows 的 bat 脚本写的很少,之前在《鸟哥私房菜》上学过一点 bash 的写法,就先在 Linux 平台上进行测试。

一开始脚本测试都正常,在终端可以实现完整的操作。但是在 Java 代码里就出问题了,查到构造 Linux 环境下的启动外部程序的过程是构造命令字符串,然后调用 /bin/sh -c some_command 来执行。但是测试代码始终执行不了我写的脚本。这就头大了。

都是这个 -c 参数让我吃了很多苦头。先是查不到它的作用,后来才想到应该先 man 的。man 了之后发现还是看不懂它的意思。

发现在项目目录下,执行

$ sh -c 'app.sh start'

总是报错,app.sh not found. 但是执行

$ sh -c 'ls -l'

就可以。

Google 了很多都是说权限问题或者 #!/bin/sh 之类的,完全不是我要得答案。再仔细想了一下结果,发现了问题所在。

因为 -c 参数是让 sh 要执行的指令和参数从后面给的 command_string 中获取,但是!是重新开一个 shell 来执行。也就是说后面的命令字符串是在一个新 shell 中执行。没有使用 sh app.sh./app.sh 导致找不到可执行文件。而且 ./ 的方式不能用在绝对路径中。

最后 Linux 下的测试全部通过了,明天开始写 bat 脚本,然后要对这块重新整理,学习一下。

to be continued...

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions