Mac OS 系统, 打开pycharm时右下角提示: xcrun: error: invalid active developer path, missing xcrun

 mac  Mac OS 系统, 打开pycharm时右下角提示: xcrun: error: invalid active developer path, missing xcrun已关闭评论
4月 092021
 

要解决此问题,请安装Xcode。如果您从事iOS App开发,则可以安装完整版本,它也将解决此问题。从Apple developers page下载Xcode .dmg文件。

如果你不使用xcode,则只需搜索Xcode的Command Line Tools(命令行工具包),然后下载.dmg文件并安装。

可以尝试下面的几个解决方案:

如果您不想下载任何内容,而只想在终端中运行一些命令来解决此问题,那么以下是适合您的命令:

xcode-select --install

这是可以在终端中运行的命令,它将为Xcode安装命令行工具。当您运行此命令时,系统将提示您接受许可证,同意条款和条件等。

 

也可以尝试下下面的命令后再使用上面的命令解决该问题:

xcode-select --reset

尽管这可以解决您的问题,但作为后续步骤,您可能需要设置命令行工具在不使用Xcode的情况下运行的路径。

xcode-select --switch /Library/Developer/CommandLineTools

如果在运行上述任何命令时遇到权限问题,请sudo与这些命令一起使用。例如,

sudo xcode-select --switch /Library/Developer/CommandLineTools

如果您已安装Xcode应用程序,请尝试运行以下命令:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )(转)

 linux, shell  linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )(转)已关闭评论
4月 012021
 

网上看到的一篇关于shell下操作字符串的好文章,linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 ),原文地址见文末。

 

1.Linux shell 截取字符变量的前8位

实现方法有如下几种:

  1. expr substr “$a” 1 8
  2. echo $a|awk ‘{print substr(,1,8)}’
  3. echo $a|cut -c1-8
  4. echo $
  5. expr $a : ‘\(.\\).*’
  6. echo $a|dd bs=1 count=8 2>/dev/null

 

2.按指定的字符串截取

(1)第一种方法:

从左向右截取最后一个string后的字符串
${varible##*string}
从左向右截取第一个string后的字符串
${varible#*string}
从右向左截取最后一个string后的字符串
${varible%%string*}
从右向左截取第一个string后的字符串
${varible%string*}
“*”只是一个通配符可以不要

请看下面的例子:

$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

(2)第二种方法:

${varible:n1:n2}:截取变量varible从n1开始的n2个字符,组成一个子字符串。可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:

$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

3.按照指定要求分割:

比如获取后缀名

ls -al | cut -d “.” -f2

小结:shell对应字符串的处理方法很多,根据需求灵活选择。

 

在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

 

一、判断读取字符串值

表达式 含义

${var} 变量var的值, 与$var相同
${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${[email protected]} 匹配之前所有以varprefix开头进行声明的变量

加入了“*”  不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.

 

 

二、字符串操作(长度,读取,替换)

表达式 含义

${#string} $string的长度
${string:position} 在$string中, 从位置$position开始提取子串
${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

说明:”* $substring”可以是一个正则表达式.

 

实例:

 

读取:

Java代码  收藏代码
  1. $ echo ${abc-‘ok’}  
  2. ok
  3. $ echo $abc
  4. $ echo ${abc=‘ok’}  
  5. ok
  6. $ echo $abc
  7. ok
  8. #如果abc 没有声明“=” 还会给abc赋值。
  9. $ var1=11;var2=12;var3=  
  10. $ echo ${[email protected]}
  11. var1 var2 var3
  12. $ echo ${!v*}
  13. var1 var2 var3
  14. #${!varprefix*}与${[email protected]}相似,可以通过变量名前缀字符,搜索已经定义的变量,无论是否为空值。

 

1,取得字符串长度

C代码  收藏代码
  1. string=abc12342341          //等号二边不要有空格  
  2. echo ${#string}             //结果11  
  3. expr length $string         //结果11  
  4. expr “$string” : “.*”       //结果11 分号二边要有空格,这里的:根match的用法差不多  

2,字符串所在位置

C代码  收藏代码
  1. expr index $string ‘123’    //结果4 字符串对应的下标是从1开始的   
C代码  收藏代码
  1. str=“abc”  
  2. expr index $str “a”  # 1  
  3. expr index $str “b”  # 2  
  4. expr index $str “x”  # 0  
  5. expr index $str “”   # 0   

 

这个方法让我想起来了js的indexOf,各种语言对字符串的操作方法大方向都差不多,如果有语言基础的话,学习shell会很快的。

 

3,从字符串开头到子串的最大长度

C代码  收藏代码
  1. expr match $string ‘abc.*3’ //结果9    

个人觉得这个函数的用处不大,为什么要从开头开始呢。

 

4,字符串截取

C代码  收藏代码
  1. echo ${string:4}      //2342341  从第4位开始截取后面所有字符串    
  2. echo ${string:3:3}    //123      从第3位开始截取后面3位    
  3. echo ${string:3:6}    //123423   从第3位开始截取后面6位    
  4. echo ${string: -4}    //2341  :右边有空格   截取后4位    
  5. echo ${string:(-4)}   //2341  同上    
  6. expr substr $string 3 3   //123  从第3位开始截取后面3位    

 

C代码  收藏代码
  1. str=“abcdef”  
  2. expr substr “$str” 1 3  # 从第一个位置开始取3个字符, abc  
  3. expr substr “$str” 2 5  # 从第二个位置开始取5个字符, bcdef   
  4. expr substr “$str” 4 5  # 从第四个位置开始取5个字符, def  
  5. echo ${str:2}           # 从第二个位置开始提取字符串, bcdef
  6. echo ${str:2:3}         # 从第二个位置开始提取3个字符, bcd
  7. echo ${str:(-6):5}        # 从倒数第二个位置向左提取字符串, abcde
  8. echo ${str:(-4):3}      # 从倒数第二个位置向左提取6个字符, cde

 

上面的方法让我想起了,php的substr函数,后面截取的规则是一样的。

 

5,匹配显示内容

C代码  收藏代码
  1. //例3中也有match和这里的match不同,上面显示的是匹配字符的长度,而下面的是匹配的内容    
  2. expr match $string ‘\([a-c]*[0-9]*\)’  //abc12342341    
  3. expr $string : ‘\([a-c]*[0-9]\)’       //abc1    
  4. expr $string : ‘.*\([0-9][0-9][0-9]\)’ //341 显示括号中匹配的内容    

 

这里括号的用法,是不是根其他的括号用法有相似之处呢,

 

6,截取不匹配的内容

C代码  收藏代码
  1. echo ${string#a*3}     //42341  从$string左边开始,去掉最短匹配子串    
  2. echo ${string#c*3}     //abc12342341  这样什么也没有匹配到    
  3. echo ${string#*c1*3}   //42341  从$string左边开始,去掉最短匹配子串    
  4. echo ${string##a*3}    //41     从$string左边开始,去掉最长匹配子串    
  5. echo ${string%3*1}     //abc12342  从$string右边开始,去掉最短匹配子串    
  6. echo ${string%%3*1}    //abc12     从$string右边开始,去掉最长匹配子串    
C代码  收藏代码
  1. str=“abbc,def,ghi,abcjkl”  
  2. echo ${str#a*c}     # 输出,def,ghi,abcjkl  一个井号(#) 表示从左边截取掉最短的匹配 (这里把abbc字串去掉)
  3. echo ${str##a*c}    # 输出jkl,             两个井号(##) 表示从左边截取掉最长的匹配 (这里把abbc,def,ghi,abc字串去掉)
  4. echo ${str#“a*c”}   # 输出abbc,def,ghi,abcjkl 因为str中没有”a*c”子串  
  5. echo ${str##“a*c”}  # 输出abbc,def,ghi,abcjkl 同理  
  6. echo ${str#*a*c*}   # 空
  7. echo ${str##*a*c*}  # 空
  8. echo ${str#d*f)     # 输出abbc,def,ghi,abcjkl,
  9. echo ${str#*d*f}    # 输出,ghi,abcjkl
  10. echo ${str%a*l}     # abbc,def,ghi  一个百分号(%)表示从右边截取最短的匹配
  11. echo ${str%%b*l}    # a             两个百分号表示(%%)表示从右边截取最长的匹配
  12. echo ${str%a*c}     # abbc,def,ghi,abcjkl

这里要注意,必须从字符串的第一个字符开始,或者从最后一个开始,可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面)  。

 

7,匹配并且替换

C代码  收藏代码
  1. echo ${string/23/bb}   //abc1bb42341  替换一次    
  2. echo ${string//23/bb}  //abc1bb4bb41  双斜杠替换所有匹配    
  3. echo ${string/#abc/bb} //bb12342341   #以什么开头来匹配,根php中的^有点像    
  4. echo ${string/%41/bb}  //abc123423bb  %以什么结尾来匹配,根php中的$有点像   

 

C代码  收藏代码
  1. str=“apple, tree, apple tree”  
  2. echo ${str/apple/APPLE}   # 替换第一次出现的apple
  3. echo ${str//apple/APPLE}  # 替换所有apple  
  4. echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它
  5. echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它
C代码  收藏代码
  1. $ test=‘c:/windows/boot.ini’  
  2. $ echo ${test/\//\\}  
  3. c:\windows/boot.ini
  4. $ echo ${test//\//\\}  
  5. c:\windows\boot.ini
  6. #${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。  

8. 比较

C代码  收藏代码
  1. [[ “a.txt” == a* ]]        # 逻辑真 (pattern matching)  
  2. [[ “a.txt” =~ .*\.txt ]]   # 逻辑真 (regex matching)  
  3. [[ “abc” == “abc” ]]       # 逻辑真 (string comparision)   
  4. [[ “11” < “2” ]]           # 逻辑真 (string comparision), 按ascii值比较  

9. 连接

C代码  收藏代码
  1. s1=“hello”  
  2. s2=“world”  
  3. echo ${s1}${s2}   # 当然这样写 $s1$s2 也行,但最好加上大括号
10. 字符串删除

Java代码  收藏代码
  1. $ test=‘c:/windows/boot.ini’  
  2. $ echo ${test#/}
  3. c:/windows/boot.ini
  4. $ echo ${test#*/}
  5. windows/boot.ini
  6. $ echo ${test##*/}
  7. boot.ini
  8. $ echo ${test%/*} 
  9. c:/windows 
  10. $ echo ${test%%/*} 
  11. #${变量名#substring正则表达式}从字符串开头开始配备substring,删除匹配上的表达式。 
  12. #${变量名%substring正则表达式}从字符串结尾开始配备substring,删除匹配上的表达式。 
  13. #注意:${test##*/},${test%/*} 分别是得到文件名,或者目录地址最简单方法。   

转自:https://www.cnblogs.com/gaochsh/p/6901809.html

linux下取出两个文本文件中相同的行或不同的行,计算行数,排除重复行等

 linux  linux下取出两个文本文件中相同的行或不同的行,计算行数,排除重复行等已关闭评论
3月 302021
 

1.  两个文本文件,现在想取出其中的相同的行或不同的行,可以以下操作:(比如文件a.txt和文件b.txt)

grep -wf a.txt b.txt   (取出相同的行)

grep -wvf a.txt b.txt   (取出不相同的行)

 

2.  如果要计算取出的行一共多少行? 如下:

grep -wf a.txt b.txt  | wc -l   (相同的行一共有多少行)

 

3. 如果a.txt有重复行数据,可以使用下面命令过滤并产生新文件a1.txt,然后再用上面的方法比较

sort a.txt | uniq -c | sort -rn | cut -c 9-  > a1.txt  (sort先排序,uniq再计数,sort -rn再按重复数量倒序, cut再截取,后导出)

 

 

ssh解析、原理、入门、运用(转)

 linux, ssh  ssh解析、原理、入门、运用(转)已关闭评论
1月 252021
 

转自网上的一篇文章, 描述ssh通俗易懂,原链接见文章末尾。

 

SSH是每一台Linux电脑的标准配置。

随着Linux设备从电脑逐渐扩展到手机、外设和家用电器,SSH的使用范围也越来越广。不仅程序员离不开它,很多普通用户也每天使用。

SSH具备多种功能,可以用于很多场合。有些事情,没有它就是办不成。本文是我的学习笔记,总结和解释了SSH的常见用法,希望对大家有用。

虽然本文内容只涉及初级应用,较为简单,但是需要读者具备最基本的”Shell知识”和了解”公钥加密”的概念。

 

一、什么是SSH?

简单说,SSH是一种网络协议,用于计算机之间的加密登录。

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。

二、最基本的用法

SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。

  $ ssh [email protected]

如果本地用户名与远程用户名一致,登录时可以省略用户名。

  $ ssh host

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

  $ ssh -p 2222 [email protected]

上面这条命令表示,ssh直接连接远程主机的2222端口。

三、中间人攻击

SSH之所以能够保证安全,原因在于它采用了公钥加密。

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的“中间人攻击”(Man-in-the-middle attack)。

SSH协议是如何应对的呢?

四、口令登录

如果你是第一次登录对方主机,系统会出现下面的提示:

  $ ssh [email protected]

The authenticity of host ‘host (12.18.429.21)’ can’t be established.

RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.

Are you sure you want to continue connecting (yes/no)?

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。

假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

  Are you sure you want to continue connecting (yes/no)? yes

系统会出现一句提示,表示host主机已经得到认可。

  Warning: Permanently added ‘host,12.18.429.21’ (RSA) to the list of known hosts.

然后,会要求输入密码。

  Password: (enter password)

如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

五、公钥登录

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

  $ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程主机host上面:

  $ ssh-copy-id [email protected]

好了,从此你再登录,就不需要输入密码了。

如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面”#”注释是否取掉。

  RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

然后,重启远程主机的ssh服务。

  // ubuntu系统
service ssh restart

// debian系统
/etc/init.d/ssh restart

六、authorized_keys文件

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

  $ ssh [email protected] ‘mkdir -p .ssh && cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub

这条命令由多个语句组成,依次分解开来看:(1)”$ ssh [email protected]”,表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)”$ mkdir -p .ssh”的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)’cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

写入authorized_keys文件后,公钥登录的设置就完成了。

 

转自阮一峰的文章:http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html

Mac 上使用多点触控手势(含鼠标手势)

 mac  Mac 上使用多点触控手势(含鼠标手势)已关闭评论
8月 072020
 

在 Mac 上使用多点触控手势

使用多点触控触控板或妙控鼠标,您可以通过轻点、轻扫、捏合或开合一根或多根手指进行有用的操作。

触控板手势

有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“触控板”。您可以关闭某个手势,更改手势类型,以及了解哪些手势可在您的 Mac 上使用。

触控板手势要求使用妙控板或内建的多点触控触控板。如果您的触控板支持力度触控,您还可以进行“用力点按”操作并获得触感反馈

轻点来点按
用单指轻点来进行点按。

辅助点按(右键点按)
用双指点按或轻点。

智能缩放
用双指轻点两下可放大网页或 PDF,或缩小回原来的大小。

滚动
双指向上或向下滑动可滚动。1

放大或缩小
双指捏合或张开可放大或缩小。

旋转
双指互相以对方为中心移动,可旋转照片或其他项目。

在页面之间轻扫
双指向左或向右轻扫,可显示上一页或下一页。

打开“通知中心”
用双指从右边缘向左轻扫,可显示“通知中心”。

三指拖移
用三根手指拖移屏幕上的项目,然后点按或轻点以放下。可在“辅助功能”偏好设置中开启此功能2

 

查找和数据检测器
用三根手指轻点可查找字词,或者对日期、地址、电话号码和其他数据采取相关操作。

显示桌面
将拇指和另外三根手指同时展开,可显示桌面。

 

“启动台”
将拇指和另外三根手指合拢到一起,可显示“启动台”。

“调度中心”
用四根手指向上轻扫3,可打开“调度中心”。

应用 Exposé
用四根手指向下轻扫3,可查看正在使用的应用的所有窗口。

在全屏应用之间轻扫
用四根手指向左或向右轻扫3,可在桌面与全屏应用之间移动。

 

鼠标手势

有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“鼠标”。您可以从中关闭某个手势,更改手势类型,以及了解哪些手势可在您的 Mac 上使用。鼠标手势要求使用妙控鼠标

辅助点按(右键点按)
点按鼠标的右侧。

滚动
单指向上或向下滑动可滚动。1

智能缩放
用单指轻点两下可放大网页或 PDF,或缩小回原来的大小。

“调度中心”
用双指轻点两下,可打开“调度中心”。

在全屏应用之间轻扫
用双指向左或向右轻扫,可在桌面与全屏应用之间移动。

在页面之间轻扫
用单指向左或向右轻扫,可显示上一页或下一页。

1. 您可以在“辅助功能”偏好设置中关闭触控板滚动功能:选取苹果菜单 >“系统偏好设置”,然后点按“辅助功能”。在“鼠标与触控板”部分中,点按“触控板选项”,然后取消选择“滚动”复选框。

2.“辅助功能”偏好设置还包含单指拖移的选项:选取苹果菜单 >“系统偏好设置”,然后点按“辅助功能”。在“鼠标与触控板”部分中,点按“触控板选项”。选择“启用拖移”,然后从弹出式菜单中选取一个“拖移锁定”选项。点按问号按钮可了解有关每个选项的更多信息。

3. 在某些版本的 macOS中,这个手势使用的是三根手指,而不是四根。

 

转自苹果官网:https://support.apple.com/zh-cn/HT204895

centos 7 中文乱码问题解决

 centos  centos 7 中文乱码问题解决已关闭评论
6月 082020
 

使用aws的centos ec2, 今天编辑一个文件,发现copy进去的中文字变乱码了,原来需要将默认的en_US.UTF-8编码修改为zh_CN中文编码,操作步骤如下:

1.查看安装中文包:

查看系统是否安装中文语言包 (列出所有可用的公共语言环境的名称,包含有zh_CN)

# locale -a |grep "zh_CN"

没有输出,说明没有安装,输入下面的命令安装:

# yum groupinstall "fonts" -y

安装完成,查看安了哪些中文语言包

# locale -a |grep "zh_CN"
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8

说明系统已安装中文语言包,无需再安装。重要提示,如果按照下面的步骤你的系统仍然无法使用中文,那么请一个一个尝试上面的编码方式。比如把LANG=”zh_CN”修改为LANG=”zh_CN.gb18030″。

2.修改配置文件:

在修改配置文件之前,我们先看看当前系统语言环境:

# echo $LANG
en_US.UTF-8

# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

虽然安装了中文语言包但本机的语言环境并不是中文,需要修改locale.conf配置文件:

# vim /etc/locale.conf
LANG="zh_CN"
# source   /etc/locale.conf

也可以使用命令修改locale.conf配置文件:

#  localectl set-locale LANG=zh_CN

之后查看当前语言环境:

# echo $LANG
zh_CN

# locale
LANG=zh_CN
LC_CTYPE="zh_CN"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_COLLATE="zh_CN"
LC_MONETARY="zh_CN"
LC_MESSAGES="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL=

3. 验证是否成功:

[[email protected] ~]# date
2020年 06月 08日 星期一 11:26:03 CST

centos7下让zookeeper开机自启动

 centos  centos7下让zookeeper开机自启动已关闭评论
5月 202020
 

centos 7下zookeeper开机自启动

1将ZooKeeper设置为开机启动
1.1在init.d目录下新建脚本文件
进入到/etc/rc.d/init.d目录下,命令是:

cd    /etc/rc.d/init.d

新建一个名为zookeeper的文件,命令是:

touch    zookeeper

 

1.1.1文件内容的第一种方案(推荐)
使用vim命令修改文件内容,文件内容的写法有很多,除了上面的第一种方案,用下面的这种也可以:

#!/bin/bash
#chkconfig: 2345 10 90
#description: service zookeeper
export JAVA_HOME=/opt/java/jdk1.8.0_121
export ZOO_LOG_DIR=/opt/zookeeper/log
ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.10
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh “$1”

3.1.2文件内容的第二种方案
使用vim命令修改文件内容,文件内容是:

#!/bin/bash
#chkconfig: 2345 10 90
#description: service zookeeper
export JAVA_HOME=/opt/java/jdk1.8.0_121
export ZOO_LOG_DIR=/opt/zookeeper/log
ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.10
case “$1” in
start) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start;;
start-foreground) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start-foreground;;
stop) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh stop;;
status) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh status;;
restart) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh restart;;
upgrade)su root ${ZOOKEEPER_HOME}/bin/zkServer.sh upgrade;;
print-cmd)su root ${ZOOKEEPER_HOME}/bin/zkServer.sh print-cmd;;
*) echo “requirestart|start-foreground|stop|status|restart|print-cmd”;;
esac

1.1.3 其他说明
注意1:新建文件的命令是touch,编辑文件的命令用vi和vim都行。如果不会使用vi和vim命令,直接在本地把文件编辑好,然后用远程工具上载上去都行,不过需要注意的是如果本地用的windows系统,需要把文件转为UNIX格式。转换工具有很多,例如使用Notepad++

注意2:两个方案中的文件头部#注释的部分不能少,而且文件中诸如JDK路径,zookeeper路径都需要修改为你自己的。

1.2 执行一系列命令
为新建的/etc/rc.d/init.d/zookeeper文件添加可执行权限,命令是:

chmod  +x  /etc/rc.d/init.d/zookeeper

把zookeeper这个脚本添加到开机启动项里面,命令是:

chkconfig  –add   zookeeper

 

如果想看看是否添加成功,命令是:

chkconfig  –list

 

1.3执行测试看是否开机启动
使用命令重启机器,命令是:

reboot

方法一

查看zookeeper的状态

重启机器,然后不手动启动zookeeper的情况下,执行命令:

service  zookeeper   status

 

方法二

查看2181端口是否启用,执行命令:

lsof  -i:2181

 

方法三

查看网络状态,执行命令:

netstat   -lntup

 

 

2报错及解决
2.1 service zookeeper does not support chkconfig
执行chkconfig  –add  zookeeper报错:

servicezookeeper does not support chkconfig

问题原因和解决:

/etc/rc.d/init.d/ zookeeper脚本中头部没有添加下面这几句话(description可以随便写):

#!/bin/bash
#chkconfig:2345 10 90
#description:service zookeeper

2.2Error contacting service. It is probably not running
执行service  zookeeper  status报错:

JMX enabled by default

Usingconfig: /opt/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg

Errorcontacting service. It is probably not running.

 

问题原因和解决:

/etc/rc.d/init.d/ zookeeper没有配置对,请看3.1.1和3.1.2的配置,里面必须要有export  JAVA_HOME这一句话,后面的路径是你自己的JDK安装路径。

至于export    ZOO_LOG_DIR=/opt/zookeeper/log这一句的话可有可无,意思是指定zookeeper的启动日志存放目录,如果该目录不存在,你必须手动创建一个。

 

原文链接:https://blog.csdn.net/pucao_cug/java/article/details/71240246

linux下删除一个大文件的前n行

 linux, shell  linux下删除一个大文件的前n行已关闭评论
4月 102020
 

删除一个大文件的前n行。

方法一:

例1:删除首行
$ sed -i ‘1d’ a.txt
例2:删除前100行
$ sed -i ‘1,100d’ a.txt
例3:删除尾行
$ sed -i ‘$d’ a.txt

方法二:(举例:删除了前2行)
1.将第三行开始的内容导入新文件
tail -n +3 old_file > new_file
2.将新文件重命名为老文件
mv new_file old_file
这样就删除了前2行,速度要比sed命令快

Linux里使用shell中的$(( ))、$( )、“与${ }及区别

 linux, shell  Linux里使用shell中的$(( ))、$( )、“与${ }及区别已关闭评论
4月 072020
 
转一篇linux下关于“$(( ))、$( )、“与${ }”使用及区别的好文章。来自:https://blog.csdn.net/number_0_0/article/details/73291182
命令替换

在bash中,$( )` `(反引号)都是用来作命令替换的。
命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

exp 1

  1. $ echo today is $(date “+%Y-%m-%d”)
  2. today is 2014-07-01
$( )与``

在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:

  • ``很容易与”搞混乱,尤其对初学者来说。
  • 在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )比较直观。
  • 最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。

exp 2

  1. # 将cmd1执行结果作为cmd2参数,再将cmd2结果作为cmd3的参数
  2. cmd3 $(cmd2 $(cmd1))
  3. # 如果是用反引号,直接引用是不行的,还需要作跳脱处理
  4. cmd3 `cmd2 \`cmd1\“
${ }变量替换

一般情况下,$var${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围

  1. $ A=B
  2. $ echo ${A}B
  3. BB

取路径、文件名、后缀
先赋值一个变量为一个路径,如下:
file=/dir1/dir2/dir3/my.file.txt

命令 解释 结果
${file#*/} 拿掉第一条 / 及其左边的字符串 dir1/dir2/dir3/my.file.txt
${file##*/} 拿掉最后一条 / 及其左边的字符串 my.file.txt
${file#*.} 拿掉第一个 . 及其左边的字符串 file.txt
${file##*.} 拿掉最后一个 . 及其左边的字符串 txt
${file%/*} 拿掉最后一条 / 及其右边的字符串 /dir1/dir2/dir3
${file%%/*} 拿掉第一条 / 及其右边的字符串 (空值)
${file%.*} 拿掉最后一个 . 及其右边的字符串 /dir1/dir2/dir3/my.file
${file%%.*} 拿掉第一个 . 及其右边的字符串 /dir1/dir2/dir3/my

记忆方法如下:

  • # 是去掉左边(在键盘上 # 在 $ 之左边)
  • % 是去掉右边(在键盘上 % 在 $ 之右边)
  • 单一符号是最小匹配;两个符号是最大匹配
  • *是用来匹配不要的字符,也就是想要去掉的那部分
  • 还有指定字符分隔号,与*配合,决定取哪部分

取子串及替换

命令 解释 结果
${file:0:5} 提取最左边的 5 个字节 /dir1
${file:5:5} 提取第 5 个字节右边的连续 5 个字节 /dir2
${file/dir/path} 将第一个 dir 提换为 path /path1/dir2/dir3/my.file.txt
${file//dir/path} 将全部 dir 提换为 path /path1/path2/path3/my.file.txt
${#file} 获取变量长度 27

根据状态为变量赋值

命令 解释 备注
${file-my.file.txt} 若 $file 没设定,则使用 my.file.txt 作传回值 空值及非空值不作处理
${file:-my.file.txt} 若 $file 没有设定或为空值,则使用 my.file.txt 作传回值 非空值时不作处理
${file+my.file.txt} 若$file 设为空值或非空值,均使用my.file.txt作传回值 没设定时不作处理
${file:+my.file.txt} 若 $file 为非空值,则使用 my.file.txt 作传回值 没设定及空值不作处理
${file=txt} 若 $file 没设定,则回传 txt ,并将 $file 赋值为 txt 空值及非空值不作处理
${file:=txt} 若 $file 没设定或空值,则回传 txt ,将 $file 赋值为txt 非空值时不作处理
${file?my.file.txt} 若 $file 没设定,则将 my.file.txt 输出至 STDERR 空值及非空值不作处理
${file:?my.file.txt} 若 $file没设定或空值,则将my.file.txt输出至STDERR 非空值时不作处理

tips:
以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态. 一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.

数组

  1. A=“a b c def” # 定义字符串
  2. A=(a b c def) # 定义字符数组
命令 解释 结果
${A[@]} 返回数组全部元素 a b c def
${A[*]} 同上 a b c def
${A[0]} 返回数组第一个元素 a
${#A[@]} 返回数组元素总个数 4
${#A[*]} 同上 4
${#A[3]} 返回第四个元素的长度,即def的长度 3
A[3]=xyz 则是将第四个组数重新定义为 xyz
$(( ))与整数运算

bash中整数运算符号

符号 功能
+ – * / 分别为加、减、乘、除
% 余数运算
& | ^ ! 分别为“AND、OR、XOR、NOT”

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用。

  1. $ a=5;b=7;c=2
  2. $ echo $((a+b*c))
  3. 19
  4. $ echo $(($a+$b*$c))
  5. 19

进制转换
$(( ))可以将其他进制转成十进制数显示出来。用法如下:
echo $((N#xx))
其中,N为进制,xx为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。

  1. $ echo $((2#110)) # 二进制转十进制
  2. 6
  3. $ echo $((16#2a)) # 十六进制转十进制
  4. 42
  5. $ echo $((8#11)) # 八进制转十进制
  6. 9

(( ))重定义变量值

  1. $ a=5;b=7
  2. $ ((a++));echo $a
  3. 6
  4. $ ((a–));echo $a
  5. 5
$ ((a<b));echo $? 0

使用(( ))作整数测试时,不要跟[ ]的整数测试搞混乱了。

mac os使用tunnelblick作为openvpn客户端

 mac  mac os使用tunnelblick作为openvpn客户端已关闭评论
12月 302019
 

openvpn官网有对应的windows客户端可以下载,但没有mac os的对应版本,而Tunnelblick 是适用于Mac OS X 的OpenVPN Client 的一个GUI 版本,相当好用。

下面介绍下Tunelblick的安装和配置:

1. 安装 Tunnelblick

从以下链接下载和安装 Tunnelblick。

https://tunnelblick.net/downloads.html#releases

选择stable稳定版,我这里选择的Tunnelblick3.8.1

 

2. 双击打开

将配置文件xxx.ovpn 按下图拖入配置框

完成后点击“连接”

 

网络上也有一些免费的公共vpn配置文件可以下载,但稳定性和有效性就自己考量了。

OpenVPN 连接设置文件(.ovpn)从 公共 VPN 中继服务器列表页面 下载。

Telegram连接MTProxy时一直connecting问题

 linux  Telegram连接MTProxy时一直connecting问题已关闭评论
12月 272019
 

我们一般使用Telegram的时候,都需要先爬Qiang,这样还是比较麻烦的,而在Telegram最新版本中内置了MTProxy代理,占用小,耗电量也小,只需要我们简单设置下,就可以让Telegram和本地应用一样,即开即用,而不需要额外的爬Qiang了。

什么是Telegram MTProxy

Telegram MTProxy是Telegram官方出的一个轻量级的代理工具,可以直接配置在Telegram客户端中,不需要开启其他代理就可以直连Telegram。官方地址:Telegram MTProxy

Telegram MTProxy安装

MTProxy具体搭建过程见:https://github.com/TelegramMessenger/MTProxy

如果觉得麻烦也可以使用一键安装方式:https://github.com/FunctionClub/MTProxy-Bash

 

MTProxy 一直Connecting问题排查

情况说明:

  • Google Cloud Platform (GCP) 安装了MTProxy并正常启动(<secret>、proxy-secret、proxy-multi.conf为上面安装步骤中产生的对应文件或字符)。
./mtproto-proxy -u nobody -p 8888 -H 8443 -S <secret> --aes-pwd proxy-secret proxy-multi.conf -M 1
  • gcp上打开了8443入口的访问

 

但启动telegram客户端使用mtproxy代理时输入ip、host和secret后,始终在connecting状态,在gcp上可以看到对应端口的连接都有,但就是连接不上。

  1. 网上一种说法是:因为gcp时间与运行telegram客户端机器时间不同步,可在gcp上安装个ntp服务同步时间解决,但不适用与我这边的情况。
  2. 我这里通过下面步骤解决:使用阿里云服务器或者AWS服务器或GCP搭建Telegram MTProxy时,发现这个MTProxy绑定的是内网IP,解决方案也很简单,使用NAT模式就行,指定内网IP和外网IP, 启动命令行里需要加入  –nat-info <intranet ip>:<public ip>, 上面的启动命令变为:

./mtproto-proxy -u nobody -p 8888 -H 8443 -S <secret> –nat-info <intranet ip内网ip>:<public ip外网ip> –aes-pwd proxy-secret proxy-multi.conf -M 1

/etc/profile 添加的环境变量切换到root下环境变量无效的解决方法

 linux  /etc/profile 添加的环境变量切换到root下环境变量无效的解决方法已关闭评论
11月 192019
 

/etc/profile 添加的环境变量切换到root下环境变量无效的解决方法:

 

比如我需要添加一个nodejs的环境变量,内容如下:

export NODE_HOME=/usr/local/lib/nodejs
export PATH=${NODE_HOME}/bin:$PATH

/etc/profile.d/目录下新建一个nodejs.sh的文件,将上面的内容从/etc/profile里移到nodejs.sh中,然后运行下

$ . /etc/bashrc

 

或者直接把内容放在/etc/bashrc文件,但此方法不推荐

 

Linux下查看系统信息:CPU架构、位数、系统版本、内存信息等信息

 linux  Linux下查看系统信息:CPU架构、位数、系统版本、内存信息等信息已关闭评论
11月 192019
 

linux机器,网上下载软件时经常会看到软件包分成了32位/64位/x86/arm等不同的包,那自己的服务器适用哪个包?服务器具体的架构/位数可以通过什么命令查询呢?

 

#linux 操作系统的位数查看:

[[email protected] ~]$ getconf LONG_BIT
64

#查看cpu信息

[[email protected] ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 79
model name : Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
stepping : 1
microcode : 0xb000038
cpu MHz : 2300.141
cache size : 46080 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips : 4600.18
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 79
model name : Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
stepping : 1
microcode : 0xb000038
cpu MHz : 2300.141
cache size : 46080 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips : 4600.18
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep “cpu cores”| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep “processor”| wc -l

 

#查看cpu硬件架构

在Linux中使用命令arch可以查看机器CPU类型,如”i386”, “i486″,”i586”, “alpha”, “sparc”, “arm”, “m68k”,”mips”, “ppc”,”ia64″,”x86_64″等;ia64和x86_64就说明这台机器是64位的;

[[email protected] ~]$ arch
x86_64

或者

[[email protected] ~]$ uname -m
x86_64

uname命令可以输出一组系统信息

[[email protected] ~]$ uname -a
Linux ip-xxx.ap-southeast-1.compute.internal 4.14.146-120.181.amzn2.x86_64 #1 SMP Fri Oct 18 17:01:06 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

 

#如何查看Linux操作系统版本?不同linux版本命令稍有不同,选择可以用的
[[email protected] ~] cat /proc/version
[[email protected] ~] uname -r
[[email protected] ~] lsb_release -a
[[email protected] ~] cat /etc/issue
[[email protected] ~] cat /etc/*release*
[[email protected] ~] less /etc/redhat-release

#linux查看内存信息
[[email protected] ~] cat /proc/meminfo

macOS Mojave下安装Network Link Conditioner,提示“Network Link Conditioner”偏好设置是随 macOS 安装,不能被替换。”

 mac, xcode  macOS Mojave下安装Network Link Conditioner,提示“Network Link Conditioner”偏好设置是随 macOS 安装,不能被替换。”已关闭评论
10月 252019
 

原来mac 10 版本时安装过Network Link Conditioner,后来升级到macOS Mojave后,系统偏好设置里就没有了。 后来安装了xcode 11,需要用到Network Link Conditioner,就又下载Additional_Tools_for_Xcode_11.dmg,然后打开,进入Hardware目录里, 点击Network Link Conditioner.prefPane时提示:“Network Link Conditioner”偏好设置是随 macOS 安装,不能被替换。”

解决办法如下:
1. 第一种使用原来的。
按住 Command + Space 打开 spotlight 全局搜索
搜索 Network Link Conditioner
在结果列表里双击打开
(自动添加到设置面板并打开)

2. 第二种替换使用新的版本
将Network Link Conditioner.prefPane文件复制到/Library/PreferencePanes目录, 再进入“系统偏好设置”,就能在底部找到Network Link Conditioner工具了

pip安装包到指定目录方法(指定路径)

 mac, pip, python  pip安装包到指定目录方法(指定路径)已关闭评论
10月 242019
 

mac中使用pip安装包后,可能会发现明明提示“Successfully installed xxx“,但就是找不到这个包“ImportError: No module named  xxx”?

其实是这样: 默认pip安装在/usr/local/lib/python2.7/site-packages, 但如果sudo pip安装则会安装在/lib/python2.7/site-packages,那如果我要指定安装包的路径需要怎么做呢?使用下面的黑体字命令即可,在-install-option里添加–install-purelib指定目录即可,以下命令安装google-api-python-client包到/usr/local/lib/python2.7/site-packages

pip install --install-option="--install-purelib=/usr/local/lib/python2.7/site-packages" google-api-python-client

 

DONE!!!