-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Labels
Description
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...