Skip to content

Commit ee9826c

Browse files
authored
Merge pull request #25 from yanghaiji/linux_feature
Linux feature
2 parents c6f1172 + 41ac63c commit ee9826c

File tree

4 files changed

+480
-1
lines changed

4 files changed

+480
-1
lines changed

note/linux/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@
2020
- [🔖 Shell 输入/输出重定向](book/shell/Input.md)
2121

2222
## [🔖 java run shell]()
23-
- [🔖 何为shell编程](book/java/RunShell.md)
23+
- [🔖 Java代码调用Shell](book/java/RunShell.md)

note/linux/book/java/RunShell.md

+136
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
## Java 代码调用Shell 脚本
2+
3+
```java
4+
//在单独的进程中执行指定的字符串命令。
5+
Process exec(String command)
6+
//在单独的进程中执行指定命令和变量。
7+
Process exec(String[] cmdarray)
8+
//在指定环境的独立进程中执行指定命令和变量。
9+
Process exec(String[] cmdarray, String[] envp)
10+
//在指定环境和工作目录的独立进程中执行指定的命令和变量。
11+
Process exec(String[] cmdarray, String[] envp, File dir)
12+
//在指定环境的单独进程中执行指定的字符串命令。
13+
Process exec(String command, String[] envp)
14+
//在有指定环境和工作目录的独立进程中执行指定的字符串命令。
15+
Process exec(String command, String[] envp, File dir)
16+
17+
```
18+
19+
代码示例
20+
21+
```java
22+
package com.javayh.advanced.java.linux.shell;
23+
24+
import lombok.extern.slf4j.Slf4j;
25+
import org.apache.commons.lang3.StringUtils;
26+
27+
import java.io.BufferedReader;
28+
import java.io.IOException;
29+
import java.io.InputStreamReader;
30+
31+
/**
32+
* <p>
33+
* 调用shell脚本
34+
* </p>
35+
*
36+
* @author Dylan
37+
* @version 1.0.0
38+
* @since 2021-01-26
39+
*/
40+
@Slf4j
41+
public class ShellSend {
42+
43+
/**
44+
* 改变文件执行的权限
45+
* @param shellPath
46+
* @return
47+
* @throws Exception
48+
*/
49+
public static boolean runChmod(String shellPath) throws Exception {
50+
// 添加shell的执行权限
51+
String chmod = "chmod +x " + shellPath;
52+
Process process = null;
53+
try {
54+
process = Runtime.getRuntime().exec(chmod);
55+
int waitFor = process.waitFor();
56+
if (waitFor != 0) {
57+
log.error("改变Shell脚本执行权限发生异常");
58+
return false;
59+
}
60+
BufferedReader in = new BufferedReader(new InputStreamReader(
61+
process.getInputStream()));
62+
log.info("脚本权限添加成功 >>>>[{}]",in.readLine());
63+
} catch (IOException | InterruptedException e) {
64+
throw e;
65+
} finally {
66+
if (process != null) {
67+
process.destroy();
68+
}
69+
}
70+
return true;
71+
}
72+
73+
/**
74+
* 执行shell脚本
75+
*
76+
* @param shellPath shell脚本路劲
77+
* @param params 执行脚本所需参数
78+
* @return
79+
*/
80+
public static String runShellCommand(String shellPath, String[] params) throws IOException, InterruptedException {
81+
String execShell = "/bin/sh " + shellPath;
82+
// 执行shell脚本时的参数拼接
83+
if (params != null && params.length > 0) {
84+
for (String param : params) {
85+
execShell += " " + param;
86+
}
87+
}
88+
return run(execShell);
89+
}
90+
91+
public String runShell(String shPath){
92+
if(StringUtils.isNotBlank(shPath)){
93+
return run(shPath);
94+
}
95+
log.error("file path is null");
96+
return null;
97+
}
98+
99+
private static String run(String shPath){
100+
Process process = null;
101+
BufferedReader in = null;
102+
try {
103+
process =Runtime.getRuntime().exec(shPath);
104+
int waitFor = process.waitFor();
105+
if(waitFor != 0){
106+
log.error("run shell error");
107+
return null;
108+
}
109+
in = new BufferedReader(new InputStreamReader(
110+
process.getInputStream()));
111+
StringBuffer sb = new StringBuffer();
112+
String lineTxt;
113+
while ((lineTxt = in.readLine()) != null) {
114+
sb.append(lineTxt + "\n");
115+
}
116+
return sb.toString();
117+
} catch (IOException | InterruptedException e) {
118+
e.printStackTrace();
119+
} finally {
120+
if (process != null) {
121+
process.destroy();
122+
}
123+
if (in != null) {
124+
try {
125+
in.close();
126+
} catch (IOException e) {
127+
e.printStackTrace();
128+
log.error("关闭输出流发生异常");
129+
}
130+
}
131+
}
132+
return null;
133+
}
134+
}
135+
136+
```

note/linux/book/shell/Input.md

+230
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
## Shell 输入/输出重定向
2+
3+
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
4+
5+
重定向命令列表如下:
6+
7+
| 命令 | 说明 |
8+
| :-------------- | :------------------------------------------------- |
9+
| command > file | 将输出重定向到 file。 |
10+
| command < file | 将输入重定向到 file。 |
11+
| command >> file | 将输出以追加的方式重定向到 file。 |
12+
| n > file | 将文件描述符为 n 的文件重定向到 file。 |
13+
| n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
14+
| n >& m | 将输出文件 m 和 n 合并。 |
15+
| n <& m | 将输入文件 m 和 n 合并。 |
16+
| << tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
17+
18+
> 需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
19+
20+
------
21+
22+
## 输出重定向
23+
24+
重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:
25+
26+
```
27+
command1 > file1
28+
```
29+
30+
上面这个命令执行command1然后将输出的内容存入file1。
31+
32+
注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。
33+
34+
### 实例
35+
36+
执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):
37+
38+
```
39+
$ who > users
40+
```
41+
42+
执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。
43+
44+
你可以使用 cat 命令查看文件内容:
45+
46+
```
47+
$ cat users
48+
_mbsetupuser console Oct 31 17:35
49+
tianqixin console Oct 31 17:35
50+
tianqixin ttys000 Dec 1 11:33
51+
```
52+
53+
输出重定向会覆盖文件内容,请看下面的例子:
54+
55+
```
56+
$ echo "菜鸟教程:www.runoob.com" > users
57+
$ cat users
58+
菜鸟教程:www.runoob.com
59+
$
60+
```
61+
62+
如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
63+
64+
```
65+
$ echo "菜鸟教程:www.runoob.com" >> users
66+
$ cat users
67+
菜鸟教程:www.runoob.com
68+
菜鸟教程:www.runoob.com
69+
$
70+
```
71+
72+
------
73+
74+
## 输入重定向
75+
76+
和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
77+
78+
```
79+
command1 < file1
80+
```
81+
82+
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
83+
84+
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
85+
86+
### 实例
87+
88+
接着以上实例,我们需要统计 users 文件的行数,执行以下命令:
89+
90+
```
91+
$ wc -l users
92+
2 users
93+
```
94+
95+
也可以将输入重定向到 users 文件:
96+
97+
```
98+
$ wc -l < users
99+
2
100+
```
101+
102+
注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。
103+
104+
```
105+
command1 < infile > outfile
106+
```
107+
108+
同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
109+
110+
### 重定向深入讲解
111+
112+
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
113+
114+
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
115+
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
116+
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
117+
118+
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
119+
120+
如果希望 stderr 重定向到 file,可以这样写:
121+
122+
```
123+
$ command 2>file
124+
```
125+
126+
如果希望 stderr 追加到 file 文件末尾,可以这样写:
127+
128+
```
129+
$ command 2>>file
130+
```
131+
132+
**2** 表示标准错误文件(stderr)。
133+
134+
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
135+
136+
```
137+
$ command > file 2>&1
138+
139+
或者
140+
141+
$ command >> file 2>&1
142+
```
143+
144+
如果希望对 stdin 和 stdout 都重定向,可以这样写:
145+
146+
```
147+
$ command < file1 >file2
148+
```
149+
150+
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
151+
152+
------
153+
154+
## Here Document
155+
156+
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
157+
158+
它的基本的形式如下:
159+
160+
```
161+
command << delimiter
162+
document
163+
delimiter
164+
```
165+
166+
它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
167+
168+
> 注意:
169+
>
170+
> - 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
171+
> - 开始的delimiter前后的空格会被忽略掉。
172+
173+
### 实例
174+
175+
在命令行中通过 **wc -l** 命令计算 Here Document 的行数:
176+
177+
```
178+
$ wc -l << EOF
179+
欢迎来到
180+
菜鸟教程
181+
www.runoob.com
182+
EOF
183+
3 # 输出结果为 3 行
184+
$
185+
```
186+
187+
我们也可以将 Here Document 用在脚本中,例如:
188+
189+
```
190+
#!/bin/bash
191+
# author:菜鸟教程
192+
# url:www.runoob.com
193+
194+
cat << EOF
195+
欢迎来到
196+
菜鸟教程
197+
www.runoob.com
198+
EOF
199+
```
200+
201+
执行以上脚本,输出结果:
202+
203+
```
204+
欢迎来到
205+
菜鸟教程
206+
www.runoob.com
207+
```
208+
209+
------
210+
211+
## /dev/null 文件
212+
213+
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
214+
215+
```
216+
$ command > /dev/null
217+
```
218+
219+
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
220+
221+
如果希望屏蔽 stdout 和 stderr,可以这样写:
222+
223+
```
224+
$ command > /dev/null 2>&1
225+
```
226+
227+
> **注意:**0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
228+
>
229+
> 这里的 **2****>** 之间不可以有空格,**2>** 是一体的时候才表示错误输出。
230+

0 commit comments

Comments
 (0)