如何运行.sh脚本文件
Posted Prada-8808
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何运行.sh脚本文件相关的知识,希望对你有一定的参考价值。
最近在学习shell脚本文件时碰到了一个很尴尬的事情,就是脚本会写了,可是该怎么运行呢,于是我就翻阅了手册,查了一些资料
linux下面用命令执行.sh文件有两种方法:
一、直接./加上文件名.sh,如运行hello.sh为./hello.sh【hello.sh必须有x权限】
二、直接sh 加上文件名.sh,如运行hello.sh为sh hello.sh【hello.sh可以没有x权限】
方法一:当前目录执行.sh文件
【步骤一】cd到.sh文件所在目录
【步骤二】给.sh文件添加x执行权限
比如以hello.sh文件为例,
chmod u+x hello.sh
【步骤三】./执行.sh文件
比如以hello.sh文件为例,
终端执行以下命令:
./hello.sh
即可执行hello.sh文件
【步骤二(2)】sh 执行.sh文件
以hello.sh文件为例,sh hello.sh即可执行hello.sh文件。
sh hello.sh
方法二:绝对路径执行.sh文件
下面三种方法都可以:
1 ./home/test/shell/hello.sh
2 /home/test/shell/hello.sh
3 sh /home/test/shell/hello.sh
注意事项
用“./”加文件名.sh执行时,必须给.sh文件加x执行权限。
如何在java中运行shell脚本.sh文件
目的
我写了一个简单的java程序,我想重命名一个文件,然后我想运行我的permission.sh文件。
问题陈述
发生的事情是我的文件名成功更改但是没有执行permission.sh文件。坚持需要帮助!
以下是我的代码。
package nl.ggmd.file.Permission;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.synapse.MessageContext;
import org.apache.synapse.mediators.AbstractMediator;
public class FilePermission extends AbstractMediator
{
public boolean mediate(MessageContext context) {
try {
File oldfile =new File("/ggmd/files/uploads/FIle contract1.csv");
File newfile =new File("/ggmd/files/uploads/contract1.csv");
if(oldfile.renameTo(newfile)){
System.out.println("Rename succesful");
}else{
System.out.println("Rename failed");
}
Process proc = Runtime.getRuntime().exec("/opt/file/contracts/tst/permissions.sh");
BufferedReader read = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
try {
proc.waitFor();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
while (read.ready()) {
System.out.println(read.readLine());
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
return true;
}
}
编辑
这个java代码是WSO2 ESB的自定义类中介,而wso2没有显示java mediator的日志,因此我无法调试该问题。
以下是我的permission.sh代码。
#!/bin/bash
cd /ggmd/files/uploads/
file=contract1.csv
if [ ! -a $file ]
then
sudo chmod 664 $file && echo "The file is now writable"
else
echo "The file is already writable"
fi
建议使用Process Builder。它真的是为这种任务而构建的。
您的程序permisions.sh
不是Java可以理解的,即使操作系统将其理解为可执行文件。
您需要通知Java执行命令需要bash shell(或其他一些shell)。例如。 / bin / bash是可以运行或执行脚本的程序的路径。有了这个说你跟着这个代码片段来解决这个问题。
public class FilePermission extends AbstractMediator
{
public boolean mediate(MessageContext context) {
try {
File oldfile =new File("/ggmd/files/uploads/FIle contract1.csv");
File newfile =new File("/ggmd/files/uploads/contract1.csv");
if(oldfile.renameTo(newfile)){
System.out.println("Rename succesful");
}else{
System.out.println("Rename failed");
}
private final String commandPath = "/bin/bash";
private final String scriptPath = "/opt/file/contracts/tst/permissions.sh";
try {
Process execCommand = new ProcessBuilder(commandPath, scriptPath).start();
execCommand.waitFor();
} catch (IOException e) {
// handle exceptions
System.out.println(e.getMessage());
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
return true;
}
}
请注意,上述代码可能需要进行一些修改,尤其是当您的脚本(permissions.sh)可能依赖于当前工作目录时。上面正在使用java代码的工作目录。
但可以通过在进程对象上调用directory(File directory)
方法来更改。然后将新的工作目录路径传递给它。在这种情况下
Process execCommand = new ProcessBuilder(commandPath, scriptPath).directory(new File("/some/directory/to/be/used/")).start();
您也可以在需要时拨打execCommand.getErrorStream();
或execCommand.getInputStream();
。
以上是关于如何运行.sh脚本文件的主要内容,如果未能解决你的问题,请参考以下文章