shell学习笔记-01

bash中调用python

1.正常情况下bash解释器只能执行.sh脚本,加入<<-EOF EOF之后,可以执行python脚本(EOF只是人为定义的开始结束标记,可以换为其他字符)

#!/usr/bin/bash
ping -c1 www.baidu.com && echo "www.com" || echo "www.com is not connect"

python <<-EOF
print("hello world")
EOF

2.当前shell执行与子shell执行区别

#以下两种都是在子shell中执行,不会改变当前目录路径
bash test.sh
./test.sh
#以下两种都是在当前shell中执行,不会改变当前目录路径
. bash.sh
source bash.sh

login与nologin shell

bash路径:

#系统级
/etc/profile
/etc/bashrc

#用户级(各个用户各自独立) ~为用户根目录
~/.bash_profile
~/.bashrc
#(以上四个为登陆shell时候会执行,以下两个为离开shell时候会执行)
~/.bash_logout
~/.bash_history

login shell

su - alice
以下四个命令都会被执行
/etc/profile
/etc/bashrc
~/.bash_profile
~/.bashrc

nologin shell

su alice
只会执行以下两个命令
/etc/bashrc
~/.bashrc

常用操作

1.查看历史命令

# history
45 python predict_torch_t5.py
46 ls
47 cd .jupyter/
48 ls
49 cd title_generate/
50 ls
51 python predict_torch_t5.py
52 history

2.使用 !number(行号) 执行该行命令

3.上一个命令的最后一个参数 !$

4.上一个命令 !!

5.搜索历史命令 ctrl+r

6.查看已经设置的别名 alias,删除别名unalias

7.快捷键

ctrl+r 搜索历史命令
ctrl+d 退出命令行
ctrl+a 命令编辑,光标移动到命令最前
ctrl+e 命令编辑,光标移动到命令最后
ctrl+l 清除屏幕所有的内容,并开启一个新的一行
ctrl+k 剪切(删除)光标处到行尾的所有字符
ctrl+u 剪切(删除)光标处到行首的所有字符
ctrl+s 锁定终端,使之任何人无法输入
ctrl+q 解锁ctrl+s的锁定状态

8.后台执行命令 nohup

9.重定向:每一个进程打开一个文件都会有一个与之对应的文件描述符,只要该文件没有关闭,描述符就不会释放。三个通用的进程描述符0进程打开的输入的文件,1进程打开的输出的文件,2进程打开的输出错误的文件

##重定向符号
> 输出重定向到一个文件或设备 覆盖原来的文件
>! 输出重定向到一个文件或设备 强制覆盖原来的文件
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序
##标准错误重定向符号
2> 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件 b-shell
2>> 将一个标准错误输出重定向到一个文件或设备 追加到原来的文件
2>&1 将一个标准错误输出重定向到标准输出 注释:1 可能就是代表 标准输出
>& 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件 c-shell
|& 将一个标准错误 管道 输送 到另一个命令作为输入

##命令重导向示例
在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:
标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>
错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>

例子:

[test @test test]# ls -al > list.txt
将显示的结果输出到 list.txt 文件中,若该文件以存在则予以取代!


[test @test test]# ls -al >> list.txt
将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留!


[test @test test]# ls -al 1> list.txt 2> list.err
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err


[test @test test]# ls -al 1> list.txt 2> &1
将显示的数据,不论正确或错误均输出到 list.txt 当中!错误与正确文件输出到同一个文件中,则必须以上面的方法来写!不能写成其它格式!

[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃! /dev/null ,可以说成是黑洞装置。为空,即不保存。

cat重定向用法

##将111 222 333输入到file2中
cat <<EOF >file2
111
222
333
EOF
##将111 222 333输入到屏幕中
cat <<EOF
111
222
333
EOF

10.管道。
tee最基本的用法就是显示输出结果并且保存内容到文件中。

/home/renxingkai# ip addr | grep 'inet' | grep eth0
inet 10.120.102.100/28 brd 10.199.102.111 scope global eth0
##保存到test中(覆盖)
ip addr | grep 'inet' |tee test | grep eth0
## 追加到test中
ip addr | grep 'inet' |tee -a test | grep eth0


/home/renxingkai# df | grep '/$'
overlay 1874458716 742825040 1131633676 40% /
/home/renxingkai# cd shell_fs/
/home/renxingkai/shell_fs# df | tee df.txt | grep '/$'
overlay 1874458716 742825040 1131633676 40% /
/home/renxingkai/shell_fs# ls
df.txt ping01.sh python01.py
/home/renxingkai/shell_fs# cat df.txt
Filesystem 1K-blocks Used Available Use% Mounted on
overlay 1874458716 742825040 1131633676 40% /
tmpfs 65536 0 65536 0% /dev
tmpfs 131616820 0 131616820 0% /sys/fs/cgroup
10.48.154.172:6789,10.48.155.148:6789,10.48.156.148:6789:/mmu_ssd/pub 579820584960 568357687296 11462897664 99% /share
/dev/sda2 97039692 13075992 78991260 15% /opt/data/kess
tmpfs 131616820 0 131616820 0% /dev/shm
/dev/sdb 1874458716 742825040 1131633676 40% /etc/hosts
10.116.34.12:6789,10.116.45.11:6789,10.116.140.186:6789:/search_ssd/renxingkai 164283838464 98382159872 65901678592 60% /home/renxingkai
tmpfs 131616820 548 131616272 1% /dev/shm/kess
tmpfs 131616820 12 131616808 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 131616820 12 131616808 1% /proc/driver/nvidia
devtmpfs 131606300 0 131606300 0% /dev/nvidia6
tmpfs 131616820 0 131616820 0% /proc/acpi
tmpfs 131616820 0 131616820 0% /proc/scsi
tmpfs 131616820 0 131616820 0% /sys/firmware


## tee管道不会截流
(rapids) root@kml-dtmachine-5430-prod:/home/renxingkai/shell_fs# date > date.txt
(rapids) root@kml-dtmachine-5430-prod:/home/renxingkai/shell_fs# date | tee date.txt
Sun Oct 10 18:23:13 CST 2021

11.命令排序

如果在一行写多个shell命令,可以使用;分割

cd;eject

&& 前面命令执行成功后面才会执行

|| 前面命令失败后面也会执行

##ping成功执行is up,否则返回码非0,执行is down
ping -c1 10.18.42.1 && echo "is up." || echo "is down."

注意:

command & ##后台执行
command &> /dev/null ##混合重定向(标准输出1,错误输出2)
command1 && command2 ## 命令排序,逻辑判断

12.shell 通配符

* 匹配任意多个字符 
ls in* #in开头的所有文件
rm -rf *
rm -rf *.pdf
find / -iname "*-eth0"

?匹配任意一个字符

[]匹配括号中任意一个字符,^取非
[abc][a-z][0-9][a-zA-Z0-9][^a-z]

()在子shell中执行(cd /boot;ls) (umask 077;touch file1000)

{}集合 touch file{1-9} 建立file1-file9的文件
mkdir -pv /home/{333/{aaa,bbb},444}
可用于拷贝文件
cp -rv /home/test/{1.txt,2.txt}

\转义符号
Author: CinKate
Link: http://renxingkai.github.io/2021/10/11/shell-learn-01/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.