标准输入输出
一般情况下, 每个Linux 命令运行时都会打开三个文件:
标准输入文文件(/dev/stdin): 文件描述符为0, linux 程序默认从stdin 读取数据
标准正确输出文件(/dev/stdout): 文件描述符为1, linux 程序默认将正确输出写入stdout中
标准错误输出文件(/dev/stderr): 文件描述符为2, linux 程序默认会将错误输出写入stderr 文件夹中
csdn1013@LAPTOP-QNFOQI5C:~$ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jul 5 22:49 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jul 5 22:49 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jul 5 22:49 /dev/stdout -> /proc/self/fd/1
命令 > 文件 | 以覆盖方式, 将正确输出写入文件中 |
命令 >> 文件 | 以追加方式, 将正确输出写入文件中 |
命令 2> 文件 | 以覆盖方式, 将命令错误输出写入文件中 |
命令 2>> 文件 | 以追加方式, 将命令错误输出写入文件中 |
命令 &> 文件 | 以覆盖方式, 将命令正确&错误输出写入文件中 |
命令 &>> 文件 | 以追加方式,将命令正确&错误输出写入文件中 |
命令 >> 文件1 >> 文件2 | 以追加方式,将命令正确输出写入文件1,将错误输出写入文件2 |
输入重定向举例:
使用小于号
csdn1013@LAPTOP-QNFOQI5C:~$ wc < test1
4 26 148
将文本文件重定向到wc命令,得到文件的行,词数和字节的计数。这个例子表示特色test1文件有4行,26个单词,148字节
输出重定向举例:
Bash shell中用大于号(>)将命令的输出发送到一个文件中。
如果输出文件已经存在,重定向操作符会将新命令的结果覆盖文件的原有内容
csdn1013@LAPTOP-QNFOQI5C:~$ date > test1
csdn1013@LAPTOP-QNFOQI5C:~$ cat test1
Thu Jul 8 22:04:09 CST 2021
csdn1013@LAPTOP-QNFOQI5C:~$ ls -l > test1
csdn1013@LAPTOP-QNFOQI5C:~$ cat test1
total 0
drwxr-xr-x 1 csdn1013 csdn1013 4096 Jul 8 22:03 python
如果想追加输出内容到文件,可以使用双大于号(>>)追加数据
csdn1013@LAPTOP-QNFOQI5C:~$ date > test1
csdn1013@LAPTOP-QNFOQI5C:~$ ls -l >> test1
csdn1013@LAPTOP-QNFOQI5C:~$ cat test1
Thu Jul 8 22:07:11 CST 2021
total 0
drwxr-xr-x 1 csdn1013 csdn1013 4096 Jul 8 22:05 python
-rw-r--r-- 1 csdn1013 csdn1013 29 Jul 8 22:07 test1
确定一段命令的执行时间:
将执行命令前后的时间戳相减得到执行的时间
#!/bin/bash
start_time=`date +%s`
ls -l
ls -al
sleep 10
stop_time=`date +%s`
delta_time=$[ stop_time - start_time ]
echo "start_time ====> stop_time: $delta_time"
执行结果:
csdn1013@LAPTOP-QNFOQI5C:~$ ./date.sh
total 0
-rwxrwxrwx 1 csdn1013 csdn1013 165 Jul 8 23:00 date.sh
drwxr-xr-x 1 csdn1013 csdn1013 4096 Jul 8 22:05 python
-rw-r--r-- 1 csdn1013 csdn1013 148 Jul 8 22:07 test1
total 24
drwxr-xr-x 1 csdn1013 csdn1013 4096 Jul 8 23:00 .
drwxr-xr-x 1 root root 4096 Jul 1 23:44 ..
-rw------- 1 csdn1013 csdn1013 92 Jul 5 22:11 .bash_history
-rw-r--r-- 1 csdn1013 csdn1013 220 Jul 1 23:44 .bash_logout
-rw-r--r-- 1 csdn1013 csdn1013 3771 Jul 1 23:44 .bashrc
drwxr-xr-x 1 csdn1013 csdn1013 4096 Jul 1 23:44 .cache
drwx------ 1 csdn1013 csdn1013 4096 Jul 1 23:44 .config
-rw-r--r-- 1 csdn1013 csdn1013 807 Jul 1 23:44 .profile
-rw------- 1 csdn1013 csdn1013 330 Jul 6 00:10 .python_history
-rw-r--r-- 1 csdn1013 csdn1013 0 Jul 1 23:45 .sudo_as_admin_successful
-rw------- 1 csdn1013 csdn1013 9555 Jul 8 23:00 .viminfo
-rwxrwxrwx 1 csdn1013 csdn1013 165 Jul 8 23:00 date.sh
drwxr-xr-x 1 csdn1013 csdn1013 4096 Jul 8 22:05 python
-rw-r--r-- 1 csdn1013 csdn1013 148 Jul 8 22:07 test1
start_time ====> stop_time: 10
date命令返回系统当前的日期,而date +%s是将当前的系统时间转化为时间戳
csdn1013@LAPTOP-QNFOQI5C:~$ date
Thu Jul 8 23:24:46 CST 2021
csdn1013@LAPTOP-QNFOQI5C:~$ date +%s
1625757892
#注意date与+之间有空格,+与%s之间没有空格
执行一段命令,直到命令执行出现错误, 并且打印执行次数:
#!/bin/bash
i=0
while true
do
#ls -l可以换成你需要执行的其他命令,比如在做测试时可能会导致板卡不稳定状态而出现错误状态的命令
#可以在测试稳定性的时候,用这个简单的思路
#$?表示执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
ls -l
if [ 0 != $? ]; then
break
fi
let i++
echo "=======$i test======="
done