acwing linux 第七讲 环境变量、管道、常用命令、附录

news2025/2/2 16:07:01

文章目录

管道

概念

要点

举例

环境变量

查看

修改

常用环境变量

常用命令

系统状况

文件权限

文件检索

查看文件内容

用户相关

其他工具

安装软件

附录

Linux权限

本节课讲解的是管道,环境变量,以及常用命令

管道

概念

管道类似文件重定向,可以将前一个命令的stdout重定向到下一个命令的stdin

要点

管道命令仅处理stdout,会忽略stderr

管道右边的命令必须能接受stdin

多个管道命令可以串联

与文件重定向的区别

文件重定向,左边是命令,右边是文件

管道左右两边都是命令,左边的命令要有stdout,右边的命令要有stdin

举例

find . -name '*.py' | xargs cat | wc -l

统计当前目录所有python文件的总行数

对上面的命令进行解释:

首先,我们单独运行find . -name '*.py' ,会查找出当前目录下,所有以py结尾的文件,如下

而我们的cat命令,其作用是,给定一堆文件,将文件的内容,输出到stdout中(Concatenate FILE(s) to standard output),所以,cat命令,它接收参数,参数指定了文件名,比如cat console.log,表示将console.log这个文件中的内容,输出到stdout

xargs的作用,就是将前一个命令的stdout,转变为行参数(用空格隔开),传递给下一个命令。

假设find . -name '*.py' 的结果是

./client.py
./server.py

find . -name '*.py' | xargs cat

就相当于cat ./client.py ./server.py

cat会将多个文件的内容输出到stdout,此时再通过管道命令,将stdout传递给下一个命令wc -l,(-l for lines)就会从stdout中统计出行数。所以

find . -name '*.py' | xargs cat | wc -l

这个命令,实现的效果就是,统计当前目录下所有python文件的代码总行数。结果如下

如果上面的命令,不加xargs,会是什么效果呢

find . -name '*.py' | cat | wc -l

此时,实际统计的,就是当前目录下python文件的个数。(cat命令也接受stdin的数据,接收stdin时,就仅仅是将stdin输出到stdout

查看某个命令的用法,可以通过cmd --help,或者man cmd进行。比如查看wc命令的用法,执行wc --help

Usage: wc [OPTION]... [FILE]...

  or:  wc [OPTION]... --files0-from=F

Print newline, word, and byte counts for each FILE, and a total line if

more than one FILE is specified.  A word is a non-zero-length sequence of

characters delimited by white space.



With no FILE, or when FILE is -, read standard input.



The options below may be used to select which counts are printed, always in

the following order: newline, word, character, byte, maximum line length.

  -c, --bytes            print the byte counts

  -m, --chars            print the character counts

  -l, --lines            print the newline counts

      --files0-from=F    read input from the files specified by

                           NUL-terminated names in file F;

                           If F is - then read names from standard input

  -L, --max-line-length  print the maximum display width

  -w, --words            print the word counts

      --help     display this help and exit

      --version  output version information and exit

环境变量

Linux系统中有很多配置信息。其中,有一些配置信息,是记录在文件中的,比如系统的cpu信息,记录在/proc/cpuinfo这个文件中

cat /proc/cpuinfo

但是Linux也有一些配置信息,是放在环境变量里的。环境变量,是一种全局变量,可以被各个进程访问到,我们可以通过修改环境变量来修改系统的一些配置,很方便。

查看

查看当前环境下的全部环境变量


env # 显示当前用户的变量

set # 显示当前shell的变量,包括当前用户的变量

export # 显示当前导出为用户变量的shell变量

查看某个环境变量,比如查看PATH这个环境变量

echo $PATH

修改

可以参考shell语法章节 - 变量 小节。

比如修改HOME变量

export HOME=/

随后我们执行cd命令,当cd命令没有参数时,会回到用户的家目录(也就是回到环境变量HOME指定的目录),此时我们可以看到回到了根目录/

但是export命令修改的环境变量,只对当前这个bash生效,当我们关闭bash并重新打开一个,会发现之前的修改已失效。

那么,如何将环境变量的修改进行持久化呢?(也就是说,修改完后,我们希望之后打开的所有bash,都能够应用到此修改)

可以将修改命令放到~/.bashrc(放到这个文件的末尾,因为如果存在相同命令,后面的会覆盖前面的),修改完~/.bashrc后,记得source ~/.bashrc,来将修改应用到当前的bash环境

为何将修改命令放到~/.bashrc后,就可以确保修改会影响未来的所有bash环境呢?因为

每次启动bash,都会先执行~/.bashrc

每次ssh登录远程服务器,都会启动一个bash命令行给我们

每次tmux新开一个pane,都会启动一个bash命令行给我们

由于每次启动bash,都会加载一遍~\.bashrc,所以未来所有新开的bash环境,都会加载我们修改的内容。

(其实Linux下执行的命令,都是单独开一个进程去执行的,比如执行一个不会立即结束的命令top,可以看到最下面的那个进程就是执行top命令的进程。)

常用环境变量

HOME:用户的家目录

PATH:可执行文件(命令)的存储路径。路径之间用:分隔。在bash命令行中执行一个命令,Linux系统是怎么找到这个命令的呢?是通过遍历PATH变量下的目录,从这些目录中找到(第一个)匹配的命令或可执行文件。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。

LD_LIBRARY_PATH:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表。

C_INCLUDE_PATH:C语言的头文件路径,内容是以冒号分隔的路径列表。

CPLUS_INCLUDE_PATH:CPP的头文件路径,内容是以冒号分隔的路径列表。

PYTHONPATH:Python导入包的路径,内容是以冒号分隔的路径列表。

JAVA_HOME:jdk的安装目录。

CLASSPATH:存放Java导入类的路径,内容是以冒号分隔

常用命令

系统状况

top:查看所有进程的信息(Linux的任务管理器)

打开后,输入M:按使用内存排序

打开后,输入P:按使用CPU排序

打开后,输入q:退出

df -h:查看硬盘使用情况

free -h:查看内存使用情况

du -sh:查看当前目录占用的硬盘空间

du -h --max-depth=1

ps aux:查看所有进程

kill -9 pid:杀死编号为pid的进程

传递某个具体的信号:kill -s SIGTERM pid

netstat -nt:查看所有网络连接

w:列出当前登陆的用户

ping www.baidu.com:检查是否连网

文件权限

chmod:修改文件权限

chmod +x xxx:给xxx文件添加可执行权限

chmod -x xxx:给xxx文件去掉可执行权限

chmod 777 xxx:将xxx的权限改成777

chmod 777 xxx -R:递归修改整个文件夹的权限

其余关于Linux的权限:见附录

文件检索

find /path/to/directory/ -name '*.py':搜索某个文件路径下的所有*.py文件

grep xxx:从stdin中读入若干行数据,如果某行中包含xxx,则输出该行。(也可以添加文件名作为参数,则就是查找某个文件中的某一行是否出现xxx,若出现,则将那一行输出到stdout)

wc:统计行数,单词数,字节数

既可以从stdin中直接读取内容,也可以传入文件名作为参数

wc -l:统计行数

wc -w:统计单词数

wc -c:统计字节数

wc --help:查看帮助文档

tree:展示当前目录的文件结构

tree /path/to/directory/:展示某个目录的文件结构

tree -a:展示所有文件(包括隐藏文件)

ag xxx:搜索当前目录下的所有文件,检索xxx字符串(会列出xxx在哪个文件中的哪一行)

cut:分割一行内容

从stdin中读入多行数据

echo $PATH | cut -d ':' -f 3,5:输出PATH用:分割后第3,5列的数据

echo $PATH | cut -d ':' -f 3-5:输出PATH用:分割后第3-5列的数据

echo $PATH | cut -c 3,5:输出PATH的第3,5个字符

echo $PATH | cut -c 3-5:输出PATH的第3-5个字符

sort:将每行内容按照字典序排序

可以从stdin中读取多行数据

也可以从将文件名作为命令行参数

xargs:stdin中的数据用空格或回车分割成命令行参数

例:find . -name '*.py' | xargs cat | wc -l:统计当前目录下所有python文件的总行数

查看文件内容

more:浏览文件内容

回车:下一行

空格:下一页

b:上一页

q:退出

less:与more类似,功能更全

回车:下一行

y:上一行

Page Down:下一页

Page Up:上一页

q:退出

head -3 xxx:展示xxx的前三行

tail -3 xxx:展示xxx的末尾三行

用户相关

history:展示当前用户的历史操作。内容会持久化到~/.bash_history

其他工具

md5sum:计算md5值

可以从stdin读取数据(stdin输入数据后,敲回车,再按Ctrl + D结束输入)

也可以将文件名作为参数传入

time cmd:统计cmd命令的执行时间

ipython3:交互式python3环境。可以做计算器,或批量管理文件

tar:压缩文件

tar -zcvf xxx.tar.gz /path/to/file/*:压缩指定目录下所有文件

tar -zxvf xxx.tar.gz:解压缩

diff xxx yyy:查找文件xxx与yyy的不同点

sz file:在Xshell等工具中,发送服务器的文件到本地(s for send)

rz:在Xshell等工具中,发送本地的文件到服务器(r for read)

需要运行apt-get install lrzsz,先进行安装

安装软件

sudo cmd:以root身份执行cmd命令udo cmd:

apt-get install xxx:安装某个软件(ubuntu)

pip install xxx --user --upgrade:安装python包

附录

Linux权限

用ls -l 查看当前目录的文件

最左一列的是文件的权限相关信息,一共有10位,最左侧的第1位表示文件类型,如上图

d:表示文件夹,directory

l:表示链接,link

f:表示普通文件,file

后面的9位代表权限,前3位表示文件所有者的权限,中间3位表示文件所属用户组的权限,后3位表示其他用户的权限。

左边第二列的数字表示这个文件的连接数

左边第三列表示这个文件的拥有者(owner)

左边第四列表示这个文件所属的用户组

左边第五列表示这个文件的大小

左边第六列表示这个文件的修改时间

比如,

dr-xr-x---. 22 root root 4096 10月 20 15:01 root

这个root,是个文件夹,并且其owner是root用户,其属于root用户组,大小位4096字节。

左边第一列,后9位是文件权限,前3位是owner权限,r-x,表示这个root文件夹,对于root用户,是可读,可执行的,中间3位是用户组权限,r-x表示这个root文件夹,对于root用户组里的用户,是可读,可执行的,最后3位是其他用户的权限,---表示其他用户对这个文件夹不可读,不可写,不可执行。

可以为某个文件修改权限,使用chmod

chmod u+x run.sh 给run.sh这个文件的owner添加执行权限

chmod g+r run.sh 给run.sh这个文件所属的用户组添加读权限

chmod o-w run.sh 给run.sh这个文件的其他用户删除写权限

chmod a+x run.sh 给run.sh这个文件的所有用户添加执行权限

权限就3种,rwx,读,写,执行,也用3个二进制位来表示,比如111表示三个权限都有,十进制就是7,110表示只有读写权限,十进制就是6,一般我们会用chmod 777 run.sh 给全部用户添加全部权限

chmod 751 run.sh 给run.sh的owner添加全部全写,给其所属的用户组添加读,执行权限(101),给其他用户添加执行权限001

chmod u=rwx,g=rx,o=x run.sh 效果跟上面的命令一样

chmod =r run.sh 给所有用户分配读权限(augo不写的话默认是a)

chmod 444 run.sh 效果同上

chmod -R u+r dir 递归地给 dir这个目录下所有文件及其子目录的owner分配读权限

若想要改变某个文件的owner,可以用chown命令(有时某个目录或文件没有执行权限,可以通过修改文件或目录的owner来解决)

如,递归的给dir目录下的所有文件及子目录修改其owner为yogurt

chown -R yogurt:yogurt dir/

第一个yogurt是用户,第二个yogurt是所属用户组

如何查看系统都有哪些用户?

cat /etc/passwd

只看用户名称

cat /etc/passwd | cut -f1 -d :

查看某个用户的所属组

groups 查看当前用户所属的用户组

groups yogurt 查看用户yogurt所属的用户组

切换用户:su root 切换到root用户 ,su yogurt 切换到yogurt用户(su for switch user,or shift user)

不带参数的su 表示切换到root用户

注意,su 只是切换了用户,而没有切换用户所使用的shell,即,如果当前用户是yogurt

然后我使用su root切换到root用户,则只是换了用户身份,但是shell环境仍然是yogurt的shell,所以在root的PATH变量中的一些命令,是调用不到的

可以看到,只是切换用户的话,当前工作目录都没有发生变化。用su -,会同时切换shell环境。用su只切换用户身份

sudo表示以root权限来运行某个命令。默认情况下,只有root用户才能执行sudo命令,但可以让普通用户以root权限执行某条命令,只要将该用户配置在/etc/sudoers里面即可,

比如sudo su表示以root权限来运行su命令,这样可以不用输入密码root的密码(前提是,在/etc/sudoers配置文件中配置当前用户)

比如当前用户是yogurt,若没进行配置

则会要求输入yogurt的密码

用root用户,修改/etc/sudoers配置文件

然后再在yogurt用户下,用sudo su 就能直接切换到root

当然,用su来切换到root,仍然需要输入root密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MD5的实现与“破解”

MD5的实现与“破解” 文章目录 MD5的实现与“破解”一、 概述二、 MD5简单介绍三、 MD5的实现四、 MD5的“破解”五、MD5的“破解”方法1. 暴力破解:穷举法&字典法2. 时间和空间的折中:哈希链表法&彩虹表法2.1. 哈希链表法的过程2.2. 哈希链表可…

C# WPF上位机开发(多线程中锁的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 多线程编程一般都会涉及到锁的时候,很多人可能觉得很意外,为什么会需要这么一个锁。本质上,这主要还是因为多线…

深度学习中的损失函数

1 损失函数概述 大多数深度学习算法都会涉及某种形式的优化,所谓优化指的是改变以最小化或最大化某个函数 的任务,我们通常以最小化指代大多数最优化问题。 在机器学习中,损失函数是代价函数的一部分,而代价函数是目标函数的一种…

python脚本传参

sys.argvargparse 第一种:argparse 简单使用: import argparse # 创建一个参数解析实例 parser argparse.ArgumentParser(descriptionParameters) # 添加参数解析 parser.add_argument(--training_epoch, typeint, default3000) parser.add_argument(…

Layui 下拉select多选实现

1. html <div id"mo_deptment"></div> 2.引用 <script src"~/layuiadmin/layui/xm-select.js"></script>3.设置全局变量存储控件 var mo_deptmentSelect; 4.layui.use 中初始化 4.1 列表数据 var mo_deptmentdata [ …

Ubuntu 常用命令之 mkfs 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 mkfs 是在 Linux 和其他 Unix-like 系统中用于创建文件系统的命令。在 Ubuntu 系统中&#xff0c;mkfs 命令也是用于创建文件系统的。mkfs 是一个包装器&#xff0c;它会根据用户指定的文件系统类型调用相应的程序。 mkfs 命令的…

第11章 GUI Page403~405 步骤三 设置滚动范围

运行效果&#xff1a; 源代码&#xff1a; /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…

【C语言】记录一次自己犯下的低级错误 o(╯□╰)o(局部数组与指针数组的传参、赋值)

在这里分享一下本人犯下的低级错误&#xff0c;希望大家别掉同样的坑 o(╥﹏╥)o 文章目录 事情原委错误分析及解救办法错误一&#xff1a; 使用局部数组arr并将其作为返回值解决方法&#xff1a;使用动态内存分配来创建数组&#xff0c;并在函数结束前手动释放内存。 错误二&…

Mac查询本机ip地址

Mac系统版本和网络配置不同&#xff0c;可能会有一些细微差别。 一、 使用系统偏好设置 1、点击屏幕左上角的Apple图标&#xff0c;选择“系统偏好设置”。 2、点击“网络”。 3、 在左侧选择当前连接的网络&#xff08;如Wi-Fi或以太网&#xff09;&#xff0c;在右侧界面&a…

在Linux系统中安装MySQL数据库

目录 一、MySQL简介 二、MySQL安装步骤 1、下载MySQL的YUM仓库文件 2、安装MySQL源 3、解决密钥异常问题 4、安装MySQL服务器 5、开启MySQL服务 6、查看MySQL服务器中root用户的初始密码 7、使用初始密码登录MySQL服务器 8、修改root用户登录MySQL服务器的密码 三、…

两个图片完美融合 泊松编辑

一、效果惊人 二、步骤 下载安装 https://github.com/Trinkle23897/Fast-Poisson-Image-Editing.git 执行 test 目录下的 python data.py下载数据 执行测试&#xff0c;可以看到效果了 $ fpie -s test1_src.jpg -m test1_mask.jpg -t test1_tgt.jpg -o result1.jpg -h1 -…

Python匹配文件模块的实战技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;文件匹配是许多应用中常见的需求&#xff0c;例如文件管理、数据处理等。本文将深入探讨Python中用于文件匹配的模块&#xff0c;包括glob、fnmatch和os.path等&#xff0c;通过丰富的示例…

代码随想录算法训练营Day7 | 344.反转字符串、541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串

LeetCode 344 反转字符串 本题思路&#xff1a;反转字符串比较简单&#xff0c;定义两个指针&#xff0c;一个 i 0, 一个 j s.length-1。然后定义一个临时变量 tmp&#xff0c;进行交换 s[i] 和 s[j]。 class Solution {public void reverseString(char[] s) {int i 0;int …

vitepress项目使用github的action自动部署到github-pages中,理论上可以通用所有

使用github的action自动部署到github-pages中 创建部署的deploy.yml文件&#xff0c;在项目的根目录下面 .github\workflows\deploy.yml 完整的代码&#xff1a;使用的是pnpm进行依赖安装。 name: 部署VitePresson:push:branches:- docs # 这段是在推送到 docs 分支时触发该…

学鸿蒙开发的过程,差点要了我的命!

我真的好想感慨一下&#xff0c;这个世界真的给计算机应届生留活路了吗&#xff1f; 看着周围的同学&#xff0c;打算搞前端、JAVA、C、C的&#xff0c;一个两个去跑去应聘。你以为是00后整治职场&#xff1f; 真相是主打一个卑微&#xff1a;现阶段以学习为主&#xff08;工资…

使用宝塔面板部署前端项目到服务器

目录 文章目录 前言 一、第一步&#xff1a;创建文件夹 二、第二步&#xff1a;部署前端项目 三、第三步&#xff1a;打开防火墙 文章目录 前言第一步&#xff1a;创建文件夹第二步&#xff1a;部署前端项目第三步&#xff1a;打开防火墙总结 前言 在此之前&#xff0c;我…

Vue3选项式API和组合式API详解

前言 相信学习Vue3的人中大多数都是之前使用Vue2开发的&#xff0c;当拿到一个Vue3项目时就接触到了组合式api&#xff0c;但对于组合式api不了解的人第一眼看上去会觉得一头雾水。&#xff1a;“什么玩意&#xff0c;乱七八糟的&#xff0c;选项式api多好&#xff0c;方法变量…

反序列化版本漏洞

laravel5.7反序列化漏洞 <?phpnamespace Illuminate\Foundation\Testing {class PendingCommand{public $test;protected $app;protected $command;protected $parameters;public function __construct($test, $app, $command, $parameters){$this->test $test; …

GLTF vs FBX:应该使用哪种格式?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 概括地说&#xff0c;如果要将数据传输到 Unity 或虚幻引擎等游戏引擎…

<蓝桥杯软件赛>零基础备赛20周--第11周--贪心

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上答疑&#x…