前言
好久没更新技术文章了,如果细算的话,或许可能大概已经有半年之久了。。
一方面是身体原因导致现在精力大不如以前了,这个很多关注我的老读者应该都知道,我就不一直拿这个说事了,说多了总感觉自己太矫情。
另一方面应该也是自己懒散习惯了,就不想再费力写一些文章了,不过我也不想为自己的懒惰做开脱,实事求是就是了。
写过文章的作者应该深有体会,写一篇文章真的要耗费非常久的时间和精力。可能业余时间和周末都会被写文章所占领。
我曾经写过一篇文章,用下班的业余时间写的,可能你想象不到我用了多久才写出来。断断续续写了差不多一个星期才完事,我想再慢的作者应该也没有我这么笨了。
但是,为什么我现在又开始写了呢?
主要是最近查资料,发现我的csdn一直都有人在关注我,评论我。没想到这篇 HashMap 在 csdn 阅读量已经破万了。
导致我内心有非常大的愧疚感,愧疚这么久了不更新,竟然还有人关注我,点赞支持我。愧疚大家都在为了学习奋力拼搏,而我却止步不前。
所以我痛定思痛,决定重新规划我的写文章计划。(不立 flag,怕倒。。)
电脑如何双开微信
写下这篇文章,是因为我发现之前用的 mac 上的双开微信软件报风险了,就不敢再用了。但是,很多人像我一样又有双开微信的需求的,那么怎样才能双开甚至多开微信呢?
下面就介绍一种朴实无华,不用任何插件和软件的方式实现你的需求。
windows系统双开微信方法
可能很多人是在 windows 系统上运行微信的,那么首先说一下 win 上怎么双开微信。
其实主要是通过 start 命令来开启一个新的程序,我们先看一下 start 的语法。
在终端输入命令:start /?
可以打开 start 的帮助文档。
上图说的已经很清楚了,我就不再赘述了。对于我们来说,主要关注微信的安装包路径。例如我的在 D盘,完整路径为:D:\Program Files (x86)\Tencent\WeChat\Wechat.exe
我们试一下,直接运行 start D:\Program Files (x86)\Tencent\WeChat\Wechat.exe
却发现提示,找不到相对应的文件。
仔细看就会发现,提示的是找不到文件 D:\Program
。发现了点什么没有,很明显,系统识别不了空格,以为我访问的是路径是 D:\Program
,直接把空格后边的截断了,所以报错。
因此,对于路径中有空格的,我们需要加引号来处理。
再次运行 start "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"
。
会发现,启动了一个新窗口,但还是启动不了微信。
此时,只需要在路径前面加上空白双引号""
,表示创建一个空白的窗口,来指向我们要打开的程序。
完整命令为 start "" "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"
,成功打开微信。
注意:执行命令时,需要微信是未打开的状态,如果已经打开一个微信了,则不会生效。
因此,如果我们需要双开微信的话,就需要写一个批处理脚本,一次运行多个程序,这样就不会出现命令失效的问题。
新建一个文件,名字随便起,例如我起的就是“微信多开”。然后,后缀名改为.bat格式。
用记事本或者 notepad++ 等编辑工具打开,输入上边的命令两行,即代表打开两个微信客户端。
start "" "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"
start "" "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"
输入多行,则代表同时打开多个微信。保存,退出。
然后直接双击运行 .bat 文件,即可。
mac系统双开微信方法
再来说下 mac 系统下怎么双开微信。其实,也是通过命令的方式,只不过是用 linux 命令来实现(mac 也是类unix系统,因此和 linux 命令类似)。
如果没有耐心看下去的话,直接运行以下命令即可多打开一个微信客户端。
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
但是,作为技术人员,还是多了解一些 linux 知识比较好(虽然比较基础。。)
输出重定向
在 linux 中,标准的输入设备默认就是指键盘,标准的输出设备默认就是指显示器,对于命令行来说就是输出在终端上。
重定向顾名思义,
- 输入重定向就是把输入从键盘重定向到其他设备。
- 输出重定向就是把输出从显示器重定向到其他设备(一般重定向到文件)。
这里需要说明一下,输入只有标准输入(stdin),而输出分为标准输出(stdout)和标准错误输出(stderr)。std 是标准的英语单词 standard 缩写。
在 linux 下,认为一切皆为文件。这里的文件不仅指普通意义上的文件,还包括目录,进程(/proc),设备(/dev),套接字等。
而每个文件都有一个文件描述符,值是一个非负整数(>=0)。
所以,输入输出也有对应的文件描述符(file descriptor,会发现很多地方都把文件描述符简写为fd)。
输入输出设备 | 文件描述符 |
---|---|
标准输入 | 0 |
标准输出 | 1 |
标准错误输出 | 2 |
输入重定向的命令符号为 <
,输出重定向的命令符号为 >
。
例如 echo hello 1> file
即是代表,本来要打印 hello 字符串到标准输出设备(终端上),但是 1> file
把它的输出结果重定向到了 file 文件中。最终会发现 file 文件中会多了一行“hello”字符。
ps:通常,标准输出重定向 1>
,也可以省略掉文件描述符1,简写为 >
。注意文件描述符和重定向符号之间是没有空格的。
/dev/null
被称为空设备,是一个特殊的设备文件。所有写入其中的数据都会被丢弃,也就是我们通常说的“黑洞”,吞噬一切。
所以, /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null
这句话的意思就是把命令执行后的标准输出重定向到空设备文件中,也就是在终端不显示任何标准输出消息。
2>&1
,中 &
表示等同的意思,2>&1
就表示 2 的输出重定向等同于 1 。也就是标准错误输出重定向等同于标准输出重定向。
所以 > /dev/null 2>&1
就代表,标准错误输出等同于标准输出,都重定向到空设备文件。就算命令运行报错,也不会在终端输出任何错误信息。因此,当我们的程序运行不需要输出任何信息(包括报错信息)的时候,通常使用这个命令。
nohup 和 & 命令
首先要明确这是两个命令,它们代表不同的含义,产生不一样的效果。
nohup
全称是 no hang up ,意思是不挂断。 &
是指后台运行。
为了测试他们的不同,我们以一段 Java 代码为例。(每隔一秒打印一下当前系统时间)
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestRun {
public static void main(String[] args) throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while(true){
System.out.println("当前时间:" + sdf.format(new Date()));
Thread.sleep(1000);
}
}
}
保存文件为 TestRun.java ,然后 javac TestRun.java
编译为 class 文件。
我们在终端直接输入 java TestRun
来运行程序。会发现,程序正常执行,每隔一秒输出一下当前系统时间。
此时按下 ctrl + c 键发送 SIGINT 信号,程序接收到信号之后就会直接停止,不再输出任何东西到控制台。
这是因为,我们运行的方式默认是前台运行的。
如果以后台方式运行,会有什么效果呢?
在终端输入 java TestRun &
,会先在终端显示程序的进程号 3120 。
然后同样按下 ctrl + c 发送 SIGINT 信号,会发现程序并没有停止,而是继续运行。
我们可以在终端打开另外一个窗口,输入 ps aux|grep TestRun
来验证是否程序真的在继续运行.
如上图,进程 3120 确实还在运行中。
此时,关闭第一个会话窗口(sesson),给程序发送 SIGHUP 信号会怎样呢?
再次 ps 查看,会发现原先的进程 3120 也停止了。
如果以 nohup 方式运行,会有什么效果呢?
在终端输入命令 nohup java TestRun
,
会有一段提示 "appending output to nohup.out",终端也没有任何程序的输出信息。
我们先不管这个 nohup.out 是什么,稍等再说。
另外打开一个窗口,ps 查看一下此时的进程号,为 3256 。
同样的先按下 ctrl + c 发送 SIGINT 信号给程序,
会发现,程序响应后停止运行了。也可以手动 ps 验证一下,
进程号 3256 确实被停止了。
再次运行 nohup java TestRun
,来验证关闭 session 会怎样。ps 查看进程号为 3386 。
然后把第一个 session 关闭,发送 SIGHUP 信号,会发现进程号 3386 依旧在。
我们再看下,nohup.out 是什么鬼?
其实 nohup 会默认(在非重定向时)在当前目录下,输出一个 nohup.out 文件。程序的输出都保存在 nohup.out 文件中。
至此,我们明白了他们之间的区别:
& 是以后台的方式运行程序,结果输出到终端。程序响应 SIGHUP 信号,而不响应 SIGINT 信号。
nohup 是不挂断的方式运行程序,结果默认输出到 nohup.out 文件。程序响应 SIGINT 信号,而不响应 SIGHUP 信号。
因此,我们通常会把 nohup 和 &
结合起来使用,对 SIGINT 和 SIGHUP 信号都不响应。这样程序就只能通过 kill 来关闭了。
实际上,nohup 的完整语法如下,
nohup Command [ Arg … ] [ & ]
,
- command 为要执行的命令,例如上边的 java TestRun
- Arg 为可选项,可以输出重定向(到文件),默认不写的话就会在当前目录生成一个 nohup.out 文件来保存输出内容
- & 为可选项,表示后台运行。
所以,如果要打开一个新的微信客户端,并且让它后台运行,不响应任何信号。同时,不在终端显示任何输出信息,结合上边的输出重定向到文件,就可以这样写,
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
- nohup 和 结尾的 & 同时使用,保证程序不会被挂断和关闭。
-
/Applications/WeChat.app/Contents/MacOS/WeChat
,用来启动微信客户端的命令。mac 下大家微信的安装目录都是这个。 -
> /dev/null 2>&1 &
表示标准输出和标准错误输出都重定向到空设备文件,即不显示。
双开微信脚本
最后,我们可以编写一个 shell 脚本来双开微信,在任意目录(我在当前登录用户的桌面上 ~/Desktop)新建一个 openWechat.sh 。然后输入,
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
保存,退出。
在当前目录下执行 sh openWechat.sh
即可同时打开两个微信客户端。若需要多开,则多加几行同样的命令。
PS:使用命令的方式,不会对微信软件本身有侵入性,所以也可以放心的使用。慎用第三方软件。
本篇文章由一文多发平台ArtiPub自动发布