2023-03-19创建、查看和编辑文本文件

将输出重定向到文件或程序

  • 标准输入、标准输出和标准错误
    进程使用称为文件描述符的通道来获取输入并发送输出。所有进程在开始时至少要有三个文件描述符:标准输入(通道0)从键盘上读取输入;标准输出(通道1)将正常输出发送到终端;标准错误(通道2)将错误消息发送到终端
    通道(文件描述符)
    -- 0 stdin 标准输入 键盘 仅读取
    -- 1 stdout 标准输出 终端 仅写入
    -- 2 stderr 标准错误 终端 仅写入
]# ls -l /dev/std*
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Mar 14 17:15 /dev/stdout -> /proc/self/fd/1
  • 将输出重定向到文件
    重定向stdout可以阻止进程输出显示在终端上。stdout不会阻止stderr错误消息显示在终端上。如果文件不存在,则会创建文件;如果文件确实存在,但是所需的重定向没有附加到文件,则该文件的内容将被覆盖。如果想要丢弃消息,特殊文件/dev/null以静默的方式丢弃重定向到其自身的通道输出,并且始终是空文件。
    输出重定向操作符:
    -- > file 重定向stdout以覆盖文件
    -- >> file 重定向stdout以附加到文件
    -- 2> file 重定向stderr以覆盖文件
    -- 2> /dev/null 将stderr错误消息重定向到/dev/null,从而将它丢弃
    -- > file 2>&1或& > file 重定向stdin和stderr以覆盖同一个文件
    -- >> file 2>&1或&>> file 重定向stdin和stderr附加到同一个文件
#将命令的输出重定向到某个文件中
[user@serverb ~]$ date >/tmp/saved-timestamp
[user@serverb ~]$ cat /tmp/saved-timestamp
Sat Mar 18 14:33:08 CST 2023
#将命令的错误消息重定向到某个文件中,标准输出默认输出在终端
[user@serverb ~]$ find /etc/ -name passwd 2> /tmp/errors
/etc/passwd
/etc/pam.d/passwd
[user@serverb ~]$ cat /tmp/errors
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#将命令的标准输出和标准错误分别重定向到两个不同的文件中
[user@serverb ~]$ find /etc/ -name passwd > /tmp/output 2> /tmp/errors
[user@serverb ~]$ cat /tmp/output /tmp/errors
/etc/passwd
/etc/pam.d/passwd
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#将标准输出重定向到某个文件中,标准错误直接忽略
[user@serverb ~]$ find /etc/ -name passwd > /tmp/output 2> /dev/null
[user@serverb ~]$ cat /tmp/output
/etc/passwd
/etc/pam.d/passwd
#将标准输出和标准错误一并重定向到文件中
[user@serverb ~]$ find /etc/ -name passwd &> /tmp/saved-both
[user@serverb ~]$ cat /tmp/saved-both
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
/etc/passwd
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
/etc/pam.d/passwd
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
#将标准输出和标准错误追加到现有的文件中
[user@serverb ~]$ find /etc/ -name passwd >> /tmp/saved-both 2>&1

构建管道

管道是一个或多个命令的序列,用竖线字符(|)分隔。管道将第一个命令的标准输出连接到下一个命令的标准输入

#查看最近更新的是个文件并重定向到文件中
[user@serverb etc]$ ls -tl  | head -10 >/tmp/ten-last-change-file
[user@serverb etc]$ cat /tmp/ten-last-change-file
total 1100
-rw-r--r--.  1 root root     58 Mar 14 16:21 subgid
-rw-r--r--.  1 root root     58 Mar 14 16:21 subuid
----------.  1 root root    408 Mar 14 16:21 gshadow
-rw-r--r--.  1 root root    518 Mar 14 16:21 group
----------.  1 root root    766 Mar 14 16:21 shadow
-rw-r--r--.  1 root root    976 Mar 14 16:21 passwd
-rw-r--r--.  1 root root  22607 Mar 14 10:34 ld.so.cache
----------.  1 root root    737 Mar 13 21:09 shadow-
-rw-r--r--.  1 root root    503 Mar 13 20:49 group-
  • tee命令
    当重定向和管道重合时,shell会首先设置整个管道,然后重定向输入/输出。如果管道的中间使用了输出重定向,则输出将转至文件,而不是下一个前往管道中的下一个命令
#终端上没有任何输出
[user@serverb glob]$ ls -l >/tmp/files | less
#如果使用了tee命令,终端会有文件的内容
[user@serverb glob]$ ls -l | tee /tmp/files | less
#管道末尾使用tee命令,则可以保存命令的最终输出并且同时输出到终端
[user@serverb etc]$ ls -tl |head -n 10 | tee /tmp/last-files
total 1100
-rw-r--r--.  1 root root     58 Mar 14 16:21 subgid
-rw-r--r--.  1 root root     58 Mar 14 16:21 subuid
----------.  1 root root    408 Mar 14 16:21 gshadow
-rw-r--r--.  1 root root    518 Mar 14 16:21 group
----------.  1 root root    766 Mar 14 16:21 shadow
-rw-r--r--.  1 root root    976 Mar 14 16:21 passwd
-rw-r--r--.  1 root root  22607 Mar 14 10:34 ld.so.cache
----------.  1 root root    737 Mar 13 21:09 shadow-
-rw-r--r--.  1 root root    503 Mar 13 20:49 group-

vim编辑器

最小化安装的Linux系统没有vim编辑器,需要安装vim-minimal软件包。vim编辑器是随Linux和unix系统分发的vi编辑器改进的,功能特别强大。
如果文件不存在,则vim可以新建文件
编辑器的三种模式:
命令模式 插入模式 末行模式
命-----按i键-----插入模式(按ESC键回到命令模式)


式-----按:键-----末行模式(按ESC键回到命令模式)
命令模式下复制、粘贴:
复制1行(yy)、复制3行(3yy)
粘贴到当前行之后(p)
命令模式下删除:
删除单个字符(x)
删除到行首(d^)、删除到行尾(d$)
删除1行(dd)、删除3行(3dd)
命令模式下查找关键字:
搜索(/word) 切换结果(n、N)
补充:在命令模式下大写的C,可以删除光标之后,并且进入输入模式

  • vim的可视模式
    可视模式是一种突出显示和操作文本的绝佳方式;最明显的就是在生产环境中修改配置文件(可批量取消注释和批量添加注释)
    -- 操作方法:
    添加注释:
    1.将光标放在要注释首行的行首CTRL+v进入可视模式
    2.向下移动光标,选中要添加注释的行
    3.按下shift+i键,并输入#
    4.按下ESC键,过后就批量注释了
    取消注释:
    1.将光标移动到要取消注释的首行的行首CTRL+v进入可视模式
    2.向下移动光标,选中要取消注释的行
    3.按下shift+x,即可取消注释

更改shell环境

bash shell允许设置shell变量,你可以使用这些变量来帮助运行命令和修改shell的行为。还可以将shell变量导出为环境变量,他们会在程序启动时自动复制到从该shell运行的程序中

  • 使用变量
    变量定义的命名规则:可以包含大写或小写字母、数字和下划线
#定义一个变量
[user@serverb ~]$ variablename=value
#可以使用$来引用变量
[user@serverb ~]$ echo $variablename
value
#使用unset取消一个变量
[user@serverb ~]$ unset variablename

使用set命令列出当前设置的所有shell变量

#定义一个变量,就能在set命令的最后看到所定义的变量
[user@serverb ~]$ set | less
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
... ...
  • 使用shell变量配置bash
    -- 例子1:history命令是显示当前用户所执行的历史命令,有两个shell变量定义HISTFILE(历史命令存放的文件)和HISTFILESIZE(定义历史命令的条数)
[user@serverb ~]$ echo $HISTFILE
/home/user/.bash_history
[user@serverb ~]$ echo $HISTFILESIZE
1000

扩展:如何将history显示的内容加上日期时间

vim ~/.bashrc
#在文件最后一行添加
HISTTIMEFORMAT="%F %T "
#加载配置文件
source ~/.bashrc
#展示
[user@serverb ~]$ history | head -1
    1  2023-03-18 14:32:31 date

-- 例子2:PS1变量显示的是shell提示符的格式

[user@serverb ~]$ echo $PS1
[\u@\h \W]\$
#可以修改
vim ~/.bashrc
#添加变量
PS1="[\u@\h \t \W]\$"
source ~/.bashrc
#提示符变了
[user@serverb 17:03:53 ~]$

使用环境变量配置程序

以上的HISTFILE和HISTFILESIZE、PS1不需要导出为环境变量,因为它们仅仅供shell本身使用,而不由从该shell运行的程序使用。

#例如修改语言
[user@serverb 17:18:20 ~]$echo $LANG
en_US.UTF-8
[user@serverb 17:18:39 ~]$export LANG=zh_CN.utf8
[user@serverb 17:18:53 ~]$date
2023年 03月 18日 星期六 17:18:55 CST
#env命令可查案shell的所有环境变量
[user@serverb 17:31:56 ~]$env
XDG_SESSION_ID=31
HOSTNAME=serverb
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
USER=user
... ...
  • 重要的环境变量PATH
    PATH变量是一个含有程序目录的冒号分隔列表
[user@serverb 17:25:15 ~]$echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin

当运行ls等命令是,shell会按照顺序逐一在这些命令中查找可执行文件ls,并且运行它找到的第一个匹配的文件

#自己创建一个命令
[user@serverb 17:30:05 ~]$vim aiguo
[user@serverb 17:30:47 ~]$bash aiguo
i love you
[user@serverb 17:30:51 ~]$chmod +x aiguo
[user@serverb 17:31:11 ~]$./aiguo
i love you
[user@serverb 17:31:16 ~]$pwd
/home/user
#将脚本所在目录添加到环境变量中
[user@serverb 17:31:24 ~]$export PATH=$PATH:/home/user
[user@serverb 17:31:53 ~]$aiguo
i love you

自动设置环境变量

  • 按照惯例,shell自动设置的环境变量和shell变量具有使用全部大写字母的名称。如果要设置自己的变量,可能需要使用由小写字符组成的名称来帮助避免命名冲突。
  • 如果希望在shell启动时自动设置shell或环境变量,可以编辑bash启动脚本。启动bash时,会运行几个包含shell命令的文本文件,以初始化shell环境。
    重要:
    在Linux中,以下是四个常见的shell配置文件及其作用和区别:

1./etc/profile:系统级别的全局配置文件,对所有用户都生效。在用户登录时,该文件会被读取并执行,设置一些系统级别的环境变量、别名、PATH等。一般不建议在该文件中添加个人的配置信息,因为这会影响所有用户。

2./etc/bashrc:系统级别的bash shell配置文件,同样对所有用户都生效。在用户打开新的终端时,该文件会被读取并执行,设置一些系统级别的别名、环境变量等。一般也不建议在该文件中添加个人的配置信息。

3.~/.bash_profile:用户级别的bash shell配置文件,仅对当前用户生效。在用户登录时,该文件会被读取并执行,设置个人的环境变量、PATH、别名等。一些基于bash的系统,如macOS,默认会在用户主目录下创建该文件,以便用户自定义shell配置。

4.~/.bashrc:用户级别的bash shell配置文件,仅对当前用户生效。在用户打开新的终端时,该文件会被读取并执行,设置个人的别名、环境变量、shell函数等。该文件是用户自定义shell配置的主要文件,经常用于设置个人的命令别名、修改提示符等。
总的来说,系统级别的配置文件作用于所有用户,个人级别的配置文件仅作用于当前用户。在修改这些配置文件时,建议备份原有的文件,并确保修改不会影响系统的正常运行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容