丙午🐎年

acc8226 的博客

重定向怎么用
文件描述符(0,1,2)

在更多了解 Linux 的重定向之前,我们需要先知道一些基本的东西,前面我们已经提到过 Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为 stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。

文件描述符 设备文件 说明
0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr 标准错误

文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

我们可以这样使用这些文件描述符:

默认使用终端的标准输入作为命令的输入和标准输出作为命令的输出

1
2
$ cat
(按Ctrl+C退出)

将 cat 的连续输出(heredoc 方式)重定向到一个文件

1
2
3
4
5
6
7
8
9
10
11
$ mkdir Documents
$ cat > Documents/test.c <<EOF
#include <stdio.h>

int main()
{
printf("hello world\n");
return 0;
}

EOF

将一个文件作为命令的输入,标准输出作为命令的输出

1
cat Documents/test.c

将 echo 命令通过管道传过来的数据作为 cat 命令的输入,将标准输出作为命令的输出

1
echo 'hi' | cat

将 echo 命令的输出从默认的标准输出重定向到一个普通文件

1
2
echo 'hello shiyanlou' > redirect
cat redirect

此处输入图片的描述

初学者这里要注意不要将管道和重定向混淆,管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接,你可以仔细体会一下上述第三个操作和最后两个操作的异同点。

2 标准错误重定向

重定向标准输出到文件,这是一个很实用的操作,另一个很实用的操作是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。比如下面的操作:

1
2
3
4
5
# 使用cat 命令同时读取两个文件,其中一个存在,另一个不存在
$ cat Documents/test.c hello.c
# 你可以看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息
# 下面我们将输出重定向到一个文件
$ cat Documents/test.c hello.c > somefile

遗憾的是,这里依然出现了那条错误信息,这正是因为如我上面说的那样,标准输出和标准错误虽然都指向终端屏幕,实际它们并不一样。那有的时候我们就是要隐藏某些错误或者警告,那又该怎么做呢。这就需要用到我们前面讲的文件描述符了:

1
2
3
4
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c hello.c > somefile 2>&1
# 或者只用 bash 提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c hello.c &>somefilehell

注意你应该在输出重定向文件描述符前加上**&**,否则 shell 会当做重定向到一个文件名为 1 的文件中

此处输入图片的描述

使用 tee 命令同时重定向到多个文件

你可能还有这样的需求,除了需要将输出重定向到文件,也需要将信息打印在终端。那么你可以使用 tee 命令来实现:

1
echo 'hello shiyanlou' | tee hello

永久重定向

你应该可以看出我们前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到“永久”有效呢,比如在一个脚本中,你需要某一部分的命令的输出全部进行重定向,难道要让你在每个命令上面加上临时重定向的操作嘛,当然不需要,我们可以使用 exec 命令实现“永久”重定向。exec 命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:

1
2
3
4
5
6
7
8
# 先开启一个子 Shell
$ zsh
# 使用 exec 替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子 shell,或取消 exec 的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile

创建输出文件描述符

在 Shell 中有 9 个文件描述符。上面我们使用了也是它默认提供的 0,1,2 号文件描述符。另外我们还可以使用 3-8 的文件描述符,只是它们默认没有打开而已。你可以使用下面命令查看当前 Shell 进程中打开的文件描述符:

1
cd /dev/fd/;ls -Al

同样使用 exec 命令可以创建新的文件描述符:

1
2
3
4
5
6
7
8
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令 > 与 & 之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit

关闭文件描述符

1
2
exec 3>&-
cd /dev/fd;ls -Al;cd -

如上面我们打开的 3 号文件描述符,可以使用如下操作将它关闭.

完全屏蔽命令的输出

在 Linux 中有一个被称为**“黑洞”**的设备文件,所有导入它的数据都将被“吞噬”。

在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个 EOF。

我们可以利用 /dev/null 屏蔽命令的输出:

1
cat Documents/test.c 1>/dev/null 2>&1

上面这样的操作将使你得不到任何输出结果。

xargs

xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。

1
cut -d: -f1 < /etc/passwd | sort | xargs echo

上面这个命令用于将 /etc/passwd 文件按 : 分割取第一个字段排序后,使用 echo 命令生成一个列表。

systemctl

systemctl 命令有两大类功能:

  • 控制 systemd 系统
  • 管理系统上运行的服务

linux systemctl 命令详解_Linux_脚本之家

find

1
2
# 移除 15 天前不包含当天的安装包
find -maxdepth 1 -mtime +15 -name 'thingsx*.rpm' -exec rm {} \;

关于时间的信息有三个:最近访问时间 access time (-atime)、最近更改时间 modify time (-mtime) 和 最近状态改动时间 change time(-ctime)

使用 find 命令在当前目录不包含子目录中查找文件
-maxdepth 1

-mtime n : n 为数字,意思为在 n 天之前的“一天之内”被更改过内容的文件
-mtime +n : 列出在 n 天之前(不含 n 天本身)被更改过内容的文件名
-mtime -n : 列出在 n 天之内(含 n 天本身)被更改过内容的文件名

授权相关

chmod 命令

chmod 命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。

[u]ser 代表用户.
[g]roup 代表用户组.
[o]thers 代表其他.
a 代表所有

这意味着 chmod u+x somefile 只授予这个文件的所属者执行的权限
= chmod +x somefile 和 chmod a+x somefile 是一样的

Linux 系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。文件或目录的访问权 限分为只读,只写和可执行三种。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
这里显示的权限是依次排列的,分别为:[用户][同组][其他]
用户权限,就是你自己的权限。英文:user,简写:u(覆盖标号123)
用户组权限,就是和你同组的人的权限。英文:group,简写:g(覆盖标号456)
其他权限,就是不和你同组的人的权限。英文:others,简写:o(覆盖标号789)
所有人的权限,英文:all,简写:a

r, 即 Read,读,权限值为4
w,即 Write,写,权限值为2
x,即 eXecute,执行,权限值为1
-,在标号 0 位置,表示普通的文件
-,其他位置,表示对应权限未开启,不具备权限
d,即 directory,表示目录文件

无任何权限:数字 0 表示
开所有权限:数字 7 表示,即 7=4+2+1

chmod 命令是用于改变文件或目录的访问权限。

+ 表示增加权限,如 u+x, u+r, u+w, g+w, g+r, o+r, a+r 等
- 表示取消权限,如 u-x, u-r, u-w, g-w, g-r, o-r, a-r 等
= 表示赋予给定权限,并取消其他所有权限(如果有的话,如原来u是rwx,设置u=r,u就剩r)

chgrp命令

功能:改变文件或目录所属的组。

语法:chgrp [选项] group filename¼

chown 命令

功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如 root 用户把自己的一个文件拷贝给用户 yusi,为了让用户 yusi 能够存取这个文件,root 用户应该把这个文件的属主设为 yusi,否则,用户 yusi 无法存取这个文件。

语法:chown [选项] 用户或组 文件

说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组 ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

其他命令

zcat

zcat 命令用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。用于查看压缩文件的内容,而无需对其进行解压缩。 它将压缩文件扩展为标准输出,使您可以查看其内容。 另外,zcat 与运行 gunzip -c 命令完全相同。

SELinux

它叫做“安全增强型 Linux(Security-Enhanced Linux)”,简称 SELinux,它是 Linux 的一个安全子系统。

  1. 运行 getenforce 命令查看 SELinux 的当前状态。

查看SELinux状态

  • 如果 SELinux 状态参数是 Disabled, 则 SELinux 为关闭状态。
  • 如果 SELinux 状态参数是 Enforcing,则 SELinux 为开启状态。本示例中 SELinux 为开启状态,因此需要关闭 SELinux。

2. 关闭 SELinux。如果 SELinux 为关闭状态可以忽略此步骤。

  • 如果您想临时关闭 SELinux,运行命令 setenforce 0。

说明 这只是暂时关闭 SELinux,下次重启 Linux 后,SELinux 还会开启。

  • 如果您想永久关闭 SELinux,运行命令 vi /etc/selinux/config 编辑 SELinux 配置文件。回车后,把光标移动到 SELINUX=enforcing 这一行,按 i 键进入编辑模式,修改为 SELINUX=disabled, 按 Esc 键,然后输入 :wq 并按Enter 键以保存并关闭 SELinux 配置文件。

说明 如果您想重新开启 SELinux,请参见SELinux 的官方文档

工具软件

rsync

rsync
https://rsync.samba.org/

Rsync 是一个提供快速增量文件传输的开源实用程序。Rsync 在 GNU 通用公共许可协议下可以免费使用,目前由韦恩•戴维森(waynedavison)维护。

参考

纠结了一阵, 9299 终入手翻新的 13.3 英寸 2017 款 MacBook Pro。它配备了 2.3GHz 双核 英特尔 酷睿 i5 7360U 处理器 ,Retina 显示屏-深空灰色

产品链接: https://www.apple.com/cn/shop/product/FPXT2CH/A

查看电脑信息

拿到一台 mac, 可首先查看电脑基本信息。

点击屏幕左上角苹果图标,在下拉菜单中,点击选择“关于本机”,可以查看本机的基本信息。

熟悉硬件

触摸板输出

macOS 一个很好用的原因,就是在于支持多点触控的触控板包含丰富的预设手势,可以很方便的帮助我们在没有鼠标的情况下完成很多操作。想要了解这些手势的话,最简单的方式是进入「系统偏好设置 - 触控板」,在这里面,可以查看当前已经开启的手势,并且每个手势都有对应的演示动画,你也可以自己设置某些操作手势。

阅读全文 »

点九图是 Android 开发中用到的一种特殊格式的图片,文件名以 .9.png 命名。这种图片能告诉开发,图像哪一部分可以被拉伸,哪一部分不能被拉伸需要保持原有比列。运用点九图可以保证图片在不模糊变形的前提下做到自适应。点九图常用于对话框和聊天气泡背景图片中。

制作点九图有四个硬性要求,只要满足这四点,点九图就可以被正确识别。

要求一:
名称格式必须为:文件名称 .9.png。

要求二:
上下左右各留有 1px 的标识线区,此区内不能有半透明像素(特别注意:切图若有投影,不要泄漏到标识线区)。

要求三:
伸缩标识线与内间距标识线为不透明的纯黑色(#000000),光学标识线为不透明的纯红色(#ff0000)。

要求四:
点九图的特殊结构会导致其4个顶角处成为“绝对禁区”,这4个1像素×1像素的区域内不能有任何内容。

伸缩线详解

伸缩线标注了切图内的拉伸区域/收缩区域。一般来说点九图越小越好,因此通常切图尺寸都要小于控件尺寸,但这并不意味着不会出现切图尺寸大于控件尺寸的情况,在这种情况下,切图会根据伸缩线来进行缩小。

从实验的结果得到三个结论:

1.切图拉伸时,仅伸缩区会被拉伸。
2.切图收缩时,首先伸缩区会被收缩。
3.当伸缩区缩小到 0 之后,切图整体继续收缩(Android 4.3 之前表现不同,谷歌公布的 Android 系统 9 月份的月度版本分布图数据显示 4.3 之前的机型占比不足 7%,所以可忽略此情况)。

每个区域的拉伸/放缩长度与本区的伸缩标识线长度成正比。

内间距线详解

内间距线所标注的是控件的内间距,而不是点九图的内间距,所以,内间距线跟点九图本身并没有直接的联系。

  1. 横向内间距线的左端到切图左端的距离为控件的左侧内间距值;
  2. 横向内间距线的右端到切图右端的距离为控件的右侧内间距值。

例如,对话框是圆角,文字需要被包裹在其内,如果纵向显示内容区域顶到两遍,显示的效果会是如下图。

虽然内间距线也可以画为多段,但是系统只关心最左端最右端的位置,所以多段内间距线是没有任何意义的。

点九图中的内间距线,仅在代码中没有指定Padding属性的时候才会生效,但这不代表可以忽略点九图中的内间距线。我建议没有特殊要求, 点 9 图都带上内边距线, 避免写padding具体的数值.

视觉边界布局(Optical bounds layout)

是在Android 4.3(Api level 18)中引入的一种新的布局对齐方式。

光学边界也叫做视觉边界,下图是一个带有投影的蓝色按钮切图。在视觉上,此图形的外轮廓是蓝色按钮所占区域,而不是切图实际所占区域。光学边界线标注的位置为投影的位置,表示此区域在视觉上不可察觉。

对于那些有透明空白边的控件来说,使用视觉边界布局在显示效果上更加整齐。 不然的话,要保证每个控件的空白透明边都是一样的才能保证内容对齐。

边界对齐了

注意:

  1. 最外边的 1px 线段必须是纯黑色(#000000),一点点的半透明的像素都不可以有,比如说 99% 的黑色或者是 1% 的投影都不可以有。(这1PX 像素在程序最终输出的效果中不会被显示),光学标识线为不透明的纯红色(#ff0000)。
  2. 文件的后缀名必须是 .9.png,不能是 .png 或者是 .9.png.png,这样的命名都会导致编译失败。
  3. 点九图的特殊结构会导致其 4 个顶角处成为“绝对禁区”,这 4 个 1 像素×1 像素的区域内不能有任何内容。
  4. 站在安卓开发的角度, 如果是纯色背景建议放在 drawable-nodpi 下, 如果是非纯色, 例如有边框, 按照行业标准一套图, 图简便放在 drawable-xxhdpi 下, 在加载背景的时候系统会进行缩放, 如果有条件多套图就多套图。

.9 图其他说明

.9 图放置在不同 dpi 文件夹下的效果

注: 若 .9 图可以设置为本身不透明,看实际需要了。例如以下就没有设置为透明。

.9 图放到 ldpi 的效果

和 xxdpi 的效果

参考

0%