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

前言

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

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

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

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

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

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

主要是最近查资料,发现我的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自动发布

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容