丙午🐎年

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 命令生成一个列表。

纠结了一阵, 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 的效果

参考

了解 Linux 常见命令

在使用 git 前,建议事先熟悉一些常见的 Linux bash 命令

  • 进入 xxx 目录 cd xxx
  • 移动$ mv [old-name] [new-name]
  • 删除单个文件 $ rm test.txt删除当前目录下的一个文件
  • 当前目录下建立文件夹 $ mkdir [folder-name]
  • 显示当前目录 $ pwd
  • 查看该目录下的文件和文件夹 $ ls -al
  • 查看该目录下的文件和文件夹包含隐藏目录 $ ls -ah

配置 config

可以通过 git config rexx.aa.bb cc, git config aa.bb.cc 'dd' 进行设置。
每一条命令都在 .git/config 文件中添加一行。如果该远程部分不存在,那么你发出的第一条命令将在该文件中为它创建。

阅读全文 »
0%