如何朴实无华的双开微信?

前言

好久没更新技术文章了,如果细算的话,或许可能大概已经有半年之久了。。

一方面是身体原因导致现在精力大不如以前了,这个很多关注我的老读者应该都知道,我就不一直拿这个说事了,说多了总感觉自己太矫情。

另一方面应该也是自己懒散习惯了,就不想再费力写一些文章了,不过我也不想为自己的懒惰做开脱,实事求是就是了。

写过文章的作者应该深有体会,写一篇文章真的要耗费非常久的时间和精力。可能业余时间和周末都会被写文章所占领。

我曾经写过一篇文章,用下班的业余时间写的,可能你想象不到我用了多久才写出来。断断续续写了差不多一个星期才完事,我想再慢的作者应该也没有我这么笨了。

但是,为什么我现在又开始写了呢?

主要是最近查资料,发现我的csdn一直都有人在关注我,评论我。没想到这篇 HashMap 在 csdn 阅读量已经破万了。

image

导致我内心有非常大的愧疚感,愧疚这么久了不更新,竟然还有人关注我,点赞支持我。愧疚大家都在为了学习奋力拼搏,而我却止步不前。

所以我痛定思痛,决定重新规划我的写文章计划。(不立 flag,怕倒。。)

电脑如何双开微信

写下这篇文章,是因为我发现之前用的 mac 上的双开微信软件报风险了,就不敢再用了。但是,很多人像我一样又有双开微信的需求的,那么怎样才能双开甚至多开微信呢?

下面就介绍一种朴实无华,不用任何插件和软件的方式实现你的需求。

windows系统双开微信方法

可能很多人是在 windows 系统上运行微信的,那么首先说一下 win 上怎么双开微信。

其实主要是通过 start 命令来开启一个新的程序,我们先看一下 start 的语法。

在终端输入命令:start /? 可以打开 start 的帮助文档。

image

上图说的已经很清楚了,我就不再赘述了。对于我们来说,主要关注微信的安装包路径。例如我的在 D盘,完整路径为:D:\Program Files (x86)\Tencent\WeChat\Wechat.exe

我们试一下,直接运行 start D:\Program Files (x86)\Tencent\WeChat\Wechat.exe

却发现提示,找不到相对应的文件。

image

仔细看就会发现,提示的是找不到文件 D:\Program。发现了点什么没有,很明显,系统识别不了空格,以为我访问的是路径是 D:\Program,直接把空格后边的截断了,所以报错。

因此,对于路径中有空格的,我们需要加引号来处理。

再次运行 start "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"

image

会发现,启动了一个新窗口,但还是启动不了微信。

此时,只需要在路径前面加上空白双引号"",表示创建一个空白的窗口,来指向我们要打开的程序。

完整命令为 start "" "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe",成功打开微信。

注意:执行命令时,需要微信是未打开的状态,如果已经打开一个微信了,则不会生效。

因此,如果我们需要双开微信的话,就需要写一个批处理脚本,一次运行多个程序,这样就不会出现命令失效的问题。

新建一个文件,名字随便起,例如我起的就是“微信多开”。然后,后缀名改为.bat格式。

image

用记事本或者 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 来运行程序。会发现,程序正常执行,每隔一秒输出一下当前系统时间。

image

此时按下 ctrl + c 键发送 SIGINT 信号,程序接收到信号之后就会直接停止,不再输出任何东西到控制台。

这是因为,我们运行的方式默认是前台运行的。

如果以后台方式运行,会有什么效果呢?

在终端输入 java TestRun & ,会先在终端显示程序的进程号 3120 。

image

然后同样按下 ctrl + c 发送 SIGINT 信号,会发现程序并没有停止,而是继续运行。

我们可以在终端打开另外一个窗口,输入 ps aux|grep TestRun 来验证是否程序真的在继续运行.

image

如上图,进程 3120 确实还在运行中。

此时,关闭第一个会话窗口(sesson),给程序发送 SIGHUP 信号会怎样呢?

image

再次 ps 查看,会发现原先的进程 3120 也停止了。

如果以 nohup 方式运行,会有什么效果呢?

在终端输入命令 nohup java TestRun

image

会有一段提示 "appending output to nohup.out",终端也没有任何程序的输出信息。

我们先不管这个 nohup.out 是什么,稍等再说。

另外打开一个窗口,ps 查看一下此时的进程号,为 3256 。

image

同样的先按下 ctrl + c 发送 SIGINT 信号给程序,

image

会发现,程序响应后停止运行了。也可以手动 ps 验证一下,

image

进程号 3256 确实被停止了。

再次运行 nohup java TestRun,来验证关闭 session 会怎样。ps 查看进程号为 3386 。

image

然后把第一个 session 关闭,发送 SIGHUP 信号,会发现进程号 3386 依旧在。

image

我们再看下,nohup.out 是什么鬼?

其实 nohup 会默认(在非重定向时)在当前目录下,输出一个 nohup.out 文件。程序的输出都保存在 nohup.out 文件中。

image

至此,我们明白了他们之间的区别:

  • & 是以后台的方式运行程序,结果输出到终端。程序响应 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自动发布

你可能感兴趣的:(如何朴实无华的双开微信?)