Linux - 标准输入标准输出,重定向
目录
编译型语言和解释型语言
c语言编译型 --》一次性编译成二进制文件,然后去执行二进制文件,跟源代码文件没有关系了,c语言里面源代码文件进行了修改,必须要重新编译,然后去执行新的二进制文件。
python解释型语言 --》一边编译一边执行,只要源代码有更新会根据源代码一行一行解释
c的速度比python快,因为c语言是把文件全部编译为二进制文件然后再执行,所以速度快,python是一边编译一边执行,所以速度慢一点
pypy是用python的解释器
cpython是使用c语言写的解释器
cpython是默认的解释器
pypy 比 cpython快4.2倍? -->来自pypy官方网站
必须使用最新版本来测试,测试后的速度确实比python3快4倍左右
依据:pypy.org --》pypy的官方网站
------------------------------------------------------------------------------------------------------------------------------
c语言,shell,cpython三种解释器的速度比较
先分别创建用c语言,shell,和python写的三个脚本
内容都是:输出:“hello,world”
c语言:
C语言的脚本需要先编译再执行
###########################################################################
[root@localhost jieshiqi]# gcc -o hello hello.c
[root@localhost jieshiqi]# time ./hello
hello,world
real 0m0.001s
user 0m0.001s
sys 0m0.000s
###########################################################################
------------------------------------------------------------------------------------------------------------------------------
shell:
###########################################################################
[root@localhost jieshiqi]# time bash hello.sh
hello,world
real 0m0.003s
user 0m0.000s
sys 0m0.002s
###########################################################################
------------------------------------------------------------------------------------------------------------------------------
python3(默认cpython)
###########################################################################
[root@localhost jieshiqi]# time python3 hello.py
hello,world!
real 0m0.031s
user 0m0.023s
sys 0m0.008s
###########################################################################
------------------------------------------------------------------------------------------------------------------------------
速度比较:
c语言: 0.001s
shell: 0.003s
python:0.031s
可以看出,c确实比python快
# shell的底层很多也是用c来写的,所以速度也比较快
------------------------------------------------------------------------------------------------------------------------------
安装pypy
首先安装epel-release --》epel源
epel是一个丰富的第三方软件库
centos里面可以使用的源:
源:软件的来源,软件仓库,大量的软件可以去下载使用
官方源:BASE源
第三方的源:epel源
[root@localhost lianxi]# yum install epel-release -y
然后安装pypy
[root@localhost jieshiqi]# yum install pypy -y
------------------------------------------------------------------------------------------------------------------------------
python的字节码文件
python文件执行 有一个中间过程
python文件执行是会生成一个字节码文件,相当于一个已经编译好的二进制文件
以.pyc结尾的文件就是字节码文件,起到加速的作用
如何看到以.pyc结尾的字节码文件?
需要在python3中导入这个python文件
###########################################################################
[root@localhost jieshiqi]# python3
Python 3.6.8 (default, Nov 16 2020, 16:55:22)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello.py --》导入python文件
hello,world!
Traceback (most recent call last):
###########################################################################
然后就可以看到字节码文件了
[root@localhost jieshiqi]# ls -a
. .. hello hello.c hello.py hello.sh __pycache__
[root@localhost jieshiqi]# cd __pycache__/
[root@localhost __pycache__]# ls
hello.cpython-36.pyc --》字节码文件
###########################################################################
wget软件
wget是linux里面的下载软件,类似于windows里面的迅雷
默认下载的软件放在当前文件夹下面
curl是linux下面字符界面的浏览器,也可以下载软件
curl和wget的区别
1.curl是浏览器,wget是纯下载
2.curl是默认安装,wget没有安装
------------------------------------------------------------------------------------------------------------------------------
重定向和文件目录高级操作
标准输入和标准输出
标准输入(STDIN):standard input
给计算机里输入内容地方式:键盘输入,语音,图像,图形等
规定从键盘输入是最标准的
标准输出(STDOUT):standard output
程序执行完成后,需要反馈
反馈到屏幕是最容易让人知道的
规定输出到屏幕是最标准的
正确的标准输出 --》都是输出到屏幕
错误的标准输出
标准输入和标准输出都是人
------------------------------------------------------------------------------------------------------------------------------
交互式设置密码:
[root@localhost lianxi]# useradd zhaojunjie
[root@localhost lianxi]# passwd zhaojunjie
更改用户 zhaojunjie 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
------------------------------------------------------------------------------------------------------------------------------
非交互式设置密码:
[root@localhost lianxi]# echo 123456|passwd zhaojunjie --stdin
更改用户 zhaojunjie 的密码 。
\passwd:所有的身份验证令牌已经成功更新。
--stdin 是passwd命令的选项
作用是告诉passwd命令 管道符号送来的内容可以作为标准输入使用
如果不接--stdin的话会报错
[root@localhost lianxi]# echo 123456|passwd zhaojunjie
更改用户 zhaojunjie 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:密码更改取消。
新的 密码:密码更改取消。
新的 密码:密码更改取消。
passwd: 已经超出服务重试的最多次数
[root@localhost lianxi]#
------------------------------------------------------------------------------------------------------------------------------
新建用户,密码练习:
脚本:
接受用户输入的用户名,帮助新建用户,并且设置密码
可以使用shell或者python来完成
需求分析:
接受用户输入:read
新建用户:useradd
设置密码:passwd
脚本名:create_user_pwd.sh
###########################################################################
[root@localhost home]# cat /lianxi/script/create_user_passwd.sh
#!/bin/bash
read -p "请输入要新建的用户名:" user
useradd $user
read -p"请输入密码:" passwd
echo $passwd | passwd $user --stdin
echo "accessfully!"
###########################################################################
如何判断用户是否创建成功?
使用id命令
如果用户新建成功会显示:
[root@localhost home]# id kimi
uid=1014(kimi) gid=1014(kimi) 组=1014(kimi)
如果用户不存在会显示:
[root@localhost home]# id kimi21
id: kimi21: no such user --说明用户不存在。
shell脚本在执行的时候是从上而下,一条一条的执行,
中间哪条命令执行失败,后面的命令也会执行
------------------------------------------------------------------------------------------------------------------------------
如何想知道整个linux系统里面有哪些用户呢?
查看/etc/passwd文件,
一行代表一个用户
[root@localhost home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
xiaowang:x:1000:1000::/home/xiaowang:/bin/bash
chenhang:x:1001:1001::/home/chenhang:/bin/bash
zhnagjian:x:1002:1002::/home/zhnagjian:/bin/bash
zhangjian:x:1003:1003::/home/zhangjian:/bin/bash
wangshenghu:x:1004:1004::/home/wangshenghu:/bin/bash
yalin:x:1005:1005::/home/yalin:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
lilanqing:x:1006:1006::/home/lilanqing:/bin/bash
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
califeng:x:1007:1007::/home/califeng:/bin/bash
cali123:x:1008:1008::/home/cali123:/bin/bash
ntp:x:38:38::/etc/ntp:/sbin/nologin
shimengmeng:x:1010:1010::/home/shimengmeng:/bin/bash
zhouyiwei:x:1011:1011::/home/zhouyiwei:/bin/bash
wangyi:x:1012:1012::/home/wangyi:/bin/bash
zhaojunjie:x:1013:1013::/home/zhaojunjie:/bin/bash
kimi:x:1014:1014::/home/kimi:/bin/bash
为什么不在/home下面查看有哪些用户?
因为有些用户新建可能没有建家目录
例如:在新建用户的时候 加一个选项 -r
[root@localhost home]# useradd -r kimi2
[root@localhost home]# ls /home
cali123 kimi shimengmeng wangyi zhouyiwei
califeng lilanqing wangshenghu zhaojunjie
可以看到家目录下面并没有kimi2这个用户
还有可能在新建用户的时候将家目录放到别的目录下面了
-d 选项,指定家目录的位置,默认放在/home下,可以是其他地方
[root@localhost home]# useradd -d /huashan linhucong
[root@localhost home]# id linhucong
uid=1015(linhucong) gid=1015(linhucong) 组=1015(linhucong)
[root@localhost home]# su - linhucong
[linhucong@localhost ~]$ pwd
/huashan
- 会加载新用户的环境变量,不使用上一个用户的环境变量
那么我们在家目录里面也找不到该用户
###########################################################################
这时我们的脚本有一个bug,就是当我们在输入一个已经存在的用户时候,会出错,提示用户已经存在,但是密码还是会继续修改,因为shell脚本从上往下执行,执行失败也会继续执行,所以我们要加一个if判断,判断用户是否存在
###########################################################################
#!/bin/bash
read -p "请输入要新建的用户名:" user
# 判断用户是否已经存在
# 无论是正确的还是错误的都输出到黑洞文件
if id $user &>/dev/null
then
echo "用户$user存在!"
else
useradd $user
read -p"请输入密码:" passwd
echo $passwd | passwd $user --stdin
echo "accessfully!"
fi
###########################################################################
$> /dev/null
/dev/null是一个特殊的文件,任何的内容重定向到这个文件,都不会保存
重定向:
改变命令的输出方向,本来标准输出往屏幕上输出,重定向后命令不再往屏 幕输出,而是输出到文件里,重定向不会影响命令的返回值的
无论正确的还是错误的重定向到黑洞文件 /dev/null
三个重要的链接文件文件:
###########################################################################
[root@localhost /]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 2月 5 09:27 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 2月 5 09:27 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 2月 5 09:27 /dev/stdout -> /proc/self/fd/1
###########################################################################
linux操作系统的理论知识:
/proc : 存放linux内核信息的,外面的用户可以通过访问/proc文件夹·去了解内核里面的信息
processes 处理
内核 kernel : linux系统内部最核心的软件
1.对cpu进行调度管理
2.对内存进行
文件描述符 fd
linux内核给每个进程创建了一个文件描述符表,这个表里记载了这个进程所打开的所有文件,为了方便进程知道自己打开了哪些文件,就给每个文件进行了编号,这个编号就是文件描述符,而且进程对文件进行读写操作的时候,就直接使用编号了,不再使用文件名。
内核kernel利用文件描述符来访问文件,文件描述符是非负整数
linux里面一起切皆文件
任何硬件都会有一个文件和它对应
/dev/stdin --》/proc/self/fd/0 --》/dev/pts/3
/dev/pts/3 -->终端设备的文件名
0 --》标准输入 --》 /dev/pts/3
1 --》标准正确输出 --》 /dev/pts/3
2 --》标准错误输出 --》 /dev/pts/3
linux 操作系统默认允许一个进行只能打开1024个进程
所有默认的文件描述的范围:0~1024
使用
------------------------------------------------------------------------------------------------------------------------------
ulimit 查看linux内核的限制参数
[root@localhost lianxi]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3795
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
使用w查看linux用户登录情况
------------------------------------------------------------------------------------------------------------------------------
[root@localhost lianxi]# w 查看linux登录的用户的情况
15:08:41 up 3:52, 3 users, load average: 0.03, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 09:27 5:40m 0.26s 0.26s -bash
root pts/0 192.168.44.1 09:28 4:00m 0.15s 0.15s -bash
root pts/1 192.168.44.1 13:40 1.00s 0.71s 0.03s w
------------------------------------------------------------------------------------------------------------------------------
15:08:41 :当前的时间
up 3:52, : 已经开机启动的时间
3 users :三个用户登录
TTY : 终端类型 terminal type
终端:面向最终用户的端口
tty1:直接登录操纵的第1个终端 --》真正的终端
linux里面允许最多6个可以直接登录的终端
tty1 - tty6
ctrl + F1 - F6 切换终端
6个终端,一个终端卡住了可以换一个终端登录
pts文件夹下是远程登录过来的终端类型 --》仿终端,,模拟的终端
pts/1 --》 /dev/pts 下面的第一个文件夹
what : 用户登录进入linux系统里面正在使用的命令
FROM: 用户从哪里登录过来的
192.168.44.1 从这个ip地址远程登录过来的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通