创建/查看/编辑文本文件
将输出重定向到文件和程序
标准 输入/输出/错误
运行的程序需要从某个位置读取输入并将输出写入某位置。从shell提示符运行的命令通常会从键盘读取输入,并将输出发送到其终端窗口。
进程通过使用文件描述符的通道编号获取输出并发送输出。所有进程开始时至少三个文件描述符。标准输入0 从键盘读取输入。标准输出1发送到终端,标准错误2发送至终端。如果需要打开连接至其他文件的单独链接,则可能使用更大文件描述符。
输出重定向到文件
> file #重定向stdout覆盖文件
>> file #重定向stdout附加到文件
2 > file #重定向stderr覆盖文件
2> /dev/null #将stderr重定向到/dev/null,从而将其丢弃
>file 2>&1 #重定向stdout和stderr覆盖同一个文件
&>file
>>file 2>&1 #重定向stdout和stderr附加同一个文件
&>>file
重定向实例
保存时间戳
[root@servera ~]# date > /tmp/timestamp
[root@servera ~]# cat /tmp/timestamp
Sun Jul 16 06:44:01 EDT 2023
将某日志文件最后10行复制到另一个文件
[root@servera log]# tail -n 10 /var/log/boot.log > /tmp/last-10-msg
[root@servera log]# cat /tmp/last-10-msg
Starting Enable periodic update of entitlement certificates....
Starting Dynamic System Tuning Daemon...
Starting Network Manager Wait Online...
Starting Hostname Service...
[ OK ] Started Enable periodic update of entitlement certificates..
[ OK ] Started OpenSSH server daemon.
[ OK ] Started Permit User Sessions.
[ OK ] Started Command Scheduler.
Starting Terminate Plymouth Boot Screen...
Starting Hold until boot process finishes up...
以下命令会生成所悟消息,将错误重定向到文件
[root@servera ~]# cat /etc/notexist 2> /tmp/errors
[root@servera ~]# cat /tmp/errors
cat: /etc/notexist: No such file or directory
构建管道
管道时一个或多个命令的序列,使用|分隔。管道将一个命令的标准输出连接到下一个命令的标准输入。
[root@servera ~]# ls -t /usr/bin | head -n 5 > /tmp/five-last-changed-files
[root@servera ~]# cat /tmp/five-last-changed-files
unversioned-python
lsgpio
lsiio
page_owner_sort
powernow-k8-decode
此管道中head 将ls -t输出内容的前5行并重定向到文件中
当重定向与管道组合时,shell会先设置整个管道,然后重定向输出/输入。如果在管道中使用输出重定向,输出将转至文件,而不是流向管道中下一个命令。
[root@servera ~]# ls / > /tmp/output | less
[root@servera ~]# cat /tmp/output
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
tee命令克服了这个现在,将标准输入复制到标准输出中,还能将标准输出重定向到指定为命令参数的文件。
[root@servera ~]# ls -l | tee /tmp/output |less
如果在管道尾使用tee命令,可以保存命令最初输出并同时输出到终端
[root@servera ~]# ls -t / | head -n 5 | tee /tmp/changed-files
tmp
etc
run
root
boot
[root@servera ~]# cat /tmp/changed-files
tmp
etc
run
root
boot
从shell提示符编辑文本文件
更改shell环境
shell变量对于特定的shell会话是唯一的。如果打开了两个终端,或通过两个独立的登录会话登录同一远程服务器。运行shell,每个shell都有自己的一组变量值。
使用以下语法将值分配给shell变量:
VARIABLENAME=value
[root@servera ~]# COUNT=40
[root@servera ~]# first_name=rkun
[root@servera ~]# file1=/tmp/abc
[root@servera ~]# _ID=RH123
这样的更改仅仅影响在其中运行命令的shell,而不影响其他shell。
可以使用set命令列出当前设置所有shell值
[root@servera ~]# set | head -n 5
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASHRCSOURCED=Y
BASH_ALIASES=()
BASH_ARGC=()
使用变量扩展检索值
使用变量扩展来指代已设置的变量值。为比哪里名称前加入$
[root@servera ~]# echo $COUNT
40
使用环境变量配置程序
shell提供了一个环境,用来在该shell中运行程序。
使用shell中定义的任何变量设置为环境变量,方法使用export命令导出。
[root@servera ~]# EDITOR=vi
[root@servera ~]# export EDITOR
重要的环境变量PATH包含一个含有程序的目录的冒号分隔列表
[root@servera ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
当运行ls等命令,shell会从这些目录找到可执行文件ls的位置
取消变量命令
unset
取消导入但不取消设置
export -n